@belisarius: Я просто потратил слишком много времени на этот вопрос! Смотрите новый ответ, используя локаторы.

я есть график в результате выполненияListPlot[] функция. Я могу вручную редактировать этот график, перемещая точки в другое место, а также добавляя новые точки, используяИнструменты рисования.

Как получить координаты новых и измененных точек из отредактированной графики?

 Alexey Popkov28 авг. 2011 г., 06:25
Вы можете найти полезное"DisplayFunction" подопцияCoordinatesToolOptions вариантGraphics что частично задокументировано в этом блоге Wolfram Blog:Получить координаты: Новое в 6.0.2" (смотрите такжеэтот пост MathGroups).

Ответы на вопрос(3)

что следующее похоже на то, что вы хотите, но тем не менее:

Если я используюListPlot следующее:

lp1 = Labeled[
   ListPlot[[email protected][{x, y}, {x, 0, 5}, {y, 5}], 
    PlotStyle -> {Directive[Red, PointSize[Large]]}], "lp1"];

Двойным щелчком по одной из красных точек дважды, чтобы получить выделение на уровне точек, я могу затем переместить отдельные точки, например, чтобы точки лежали на кривой (а не на прямой линии). Теперь я хочу извлечь эти точки (и сказать, использовать их в новомListPlot) [см. графики ниже]

Если я нажму на скобку графического изображения и использую «Показать выражение» (Command Shift E на Mac), я могу «увидеть» координаты измененных точек, которые затем могут быть извлечены. Например:

expr = Cell[
   BoxData[GraphicsBox[{RGBColor[1, 0, 0], PointSize[Large], 
      PointBox[{{0., 1.}, {0.8254488458250212, 
         2.886651181634783}, {1.9301795383300084`, 
         3.925201233010209}, {3.046546974446661, 
         4.597525796319094}, {4., 5.}}]}, 
     AspectRatio -> NCache[GoldenRatio^(-1), 0.6180339887498948], 
     Axes -> True, PlotRange -> Automatic, 
     PlotRangeClipping -> True]], "Input", 
   CellChangeTimes -> {{3.504427833788156*^9, 3.50442786823486*^9}}];

Модификация очень полезного подхода, первоначально предложенного Ярославом Булатовым, который можно найтиВот

modpoints = Flatten[Cases[expr, PointBox[___], Infinity][[All, 1]], {{2, 1}}]
РЕДАКТИРОВАТЬ

Как указал Велизарий, желательно иметь возможность извлекать «добавленные вручную точки» (которые можно добавить к сгенерированному графику, используя «точку» из палитры «Инструменты рисования»). Лучший способ извлечения (после 'Show Expression' ...), вероятно, следующий:

modpoints = Cases[Cases[expr, PointBox[___], 
  Infinity], {_?NumericQ, _?NumericQ}, Infinity]

Конечно, «Показать выражение» не единственный подход.
InputForm это еще одна возможность. Например,

expr2 = InputForm[ListPlotGraphic]

modpoints = Cases[Cases[expr, Point[___], 
  Infinity], {_?NumericQ, _?NumericQ}, Infinity]

где «ListPlotGraphic» - это измененный рисунок (вставленный «копировать и вставить»), также будет работать.

Примерные участки

добавление

Выше может быть автоматизировано с небольшим программированием ноутбука:

lp1 = Labeled[
  ListPlot[[email protected][{x, y}, {x, 0, 5}, {y, 5}], 
   PlotStyle -> {Directive[Red, PointSize[Large]]}],
  Button["Print points",
   With[{nb = ButtonNotebook[]},
    SelectionMove[nb, All, CellContents];
    Print[Cases[NotebookRead[nb], 
       PointBox[{{_?NumericQ, _?NumericQ} ..}] | 
       PointBox[{_?NumericQ, _?NumericQ}], Infinity]]]]]

Выполнение вышеупомянутого, перемещение двух последних исходных (красных) точек и добавление пары дополнительных точек синего цвета с помощью инструментов рисования, затем нажатие кнопки приводит к

Вы можете видеть, что есть одинPointBox для исходных данных и новогоPointBox за каждый из добавленных баллов. Конечно, изменяя приведенный выше код, вы можете сделать больше, чем просто распечатать исходные координаты точки.

 tomd21 янв. 2011 г., 14:11
@belisarius Это хороший момент (не каламбур!). Точки, конечно, можно легко добавить с помощью палитры «Инструменты рисования», и я добавил, возможно, лучший способ их извлечения: Cases [Cases [expr, PointBox [__], Бесконечность], {? NumericQ, _? NumericQ}, Бесконечность]. Спасибо!
 Max19 янв. 2011 г., 21:10
К сожалению, это требует ручной обработки. Я хотел бы использовать подход, где я могу изменить координаты и сразу увидеть результаты таких изменений. Например, я хотел бы запустить алгоритм кластеризации для всех точек и сразу увидеть, к какому кластеру относится точка.
 Dr. belisarius20 янв. 2011 г., 05:23
Есть ли способ «добавить» точки на график, а затем получить их в списке точек?

Если вы щелкните правой кнопкой мыши на графике, во всплывающем меню вы увидите «Получить координаты», который позволяет навести курсор мыши на точку и увидеть координаты этой точки. Конечно, это не будет точным ... но способ редактирования графики тоже не очень точный.

Вы могли бы использоватьInputForm (или жеFullForm), но я не уверен, насколько хорошо это работает ...

In[1]:= a = ListPlot[{{1, 0}, {0, 1}, {1, 1}}];
        a // InputForm

Out[2]//InputForm=
Graphics[{{{}, {Hue[0.67, 0.6, 0.6], Point[{{1., 0.}, {0., 1.}, {1., 1.}}]}, 
   {}}}, {AspectRatio -> GoldenRatio^(-1), Axes -> True, AxesOrigin -> {0, 0}, 
  PlotRange -> {{0., 1.}, {0., 1.}}, PlotRangeClipping -> True, 
  PlotRangePadding -> {Scaled[0.02], Scaled[0.02]}}]

Вы заметите, что естьPoint выражение там.

Третий вариант будет использоватьLocator в некотором роде, я думаю.

 Max18 янв. 2011 г., 21:30
Локатор, кажется, делает трюк
 Dr. belisarius19 янв. 2011 г., 07:05
@Max Если вы предлагаете элегантную реализацию Locator [] вместе с ListPlot [], пожалуйста, опубликуйте ее как ответ. Tnx!
 Simon28 авг. 2011 г., 06:06
@belisarius: Я просто потратил слишком много времени на этот вопрос! Смотрите новый ответ, используя локаторы.
Решение Вопроса

который можно перемещать. Новые локаторы могут быть добавлены, а старые могут быть удалены по мере необходимости. Лучшая подгонка и дисперсия обновляются после каждого изменения.

Вот некоторые данные о некотором экспоненциальном росте с некоторыми ошибками и отсутствующей точкой данных

data = Delete[Table[{t, (1 + RandomReal[{-.2, .2}])Exp[t]}, {t, 0, 2, .2}], 6];

Небольшая команда форматирования:

nForm = NumberForm[#, {2, 2}, NumberPadding -> {"", "0"}] &;

Наконец, вот код для создания управляемой графики.Добавлены новые локаторы / точки данных с помощьюAlt-Click (или жеCtrl-Alt-Click на Linux). Если вы щелкнете по списку точек слева, то откроется новое окно, содержащее точки в форме ввода.

Manipulate[
 LocatorPane[Dynamic[pts, {None, Temporary, Automatic}],
  nlm = Block[{a,b,t}, NonlinearModelFit[Sort[pts], a Exp[t] + b, {a, b}, t]]; 
  Show[Plot[{Exp[t], nlm[t]}, {t, 0, 2}, 
    PlotStyle -> {{Thick, LightGray}, Dotted}, PlotRangePadding -> Scaled[0.1]], 
   ListPlot[data, PlotStyle -> Blue], AxesLabel -> Block[{t,f}, {t, f[t]}]],
  LocatorAutoCreate -> True, Appearance -> Style["\[CircleDot]", Red]],
 {nlm, None}, {{pts, data}, None},
 Dynamic[Pane[EventHandler[
    [email protected][Prepend[pts, {"x", "y"}], Dividers -> {False, 2 -> True}], 
    {"MouseClicked" :> (CreateDocument[{ExpressionCell[nlm["Data"], "Output"]}, 
     WindowTitle -> "Data"])}], ImageSize -> {100, 250}, 
   ImageSizeAction -> "Scrollable", Scrollbars -> {False, True}]],
 Pane[Dynamic[[email protected]@{nlm,Row[{"\tvariance = ",nlm["EstimatedVariance"]}]}]],
 ControlPlacement -> {Left, Left, Left, Top}]

Выше я использовал локаторы, чтобы исправить пару выбросов и восстановить отсутствующую точку данных.

 Dr. belisarius28 авг. 2011 г., 16:46
+1 ... больше, если бы я мог!
 acl31 авг. 2011 г., 10:54
+1, должен когда-нибудь прочитать о внешнем программировании ...

Ваш ответ на вопрос