Możesz spróbować czegoś podobnego. Ustaw każdą linię w przycisku, który po kliknięciu identyfikuje się.
plot=Plot[{Sin[x],Cos[x]},{x,0,2*Pi}];
sinline=plot[[1,1,3,2]];
cosline=plot[[1,1,4,2]];
message="";
altplot=Append[plot,PlotLabel->Dynamic[message]];
altplot[[1,1,3,2]]=Button[sinline,message="Clicked on the Sin line"];
altplot[[1,1,4,2]]=Button[cosline,message="Clicked on the Cos line"];
altplot
Jeśli dodać Podprogram można dostać miejsce, w którym kliknął i dodawania Jeśli stawka z odpowiednią etykietą umieszczoną na działce. Owiń fabułę dynamicznie, aby aktualizował się po każdym kliknięciu przycisku. To działa dobrze.
W odpowiedzi na komentarze, tu jest pełniejsza wersja:
plot = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}];
sinline = plot[[1, 1, 3, 2]];
cosline = plot[[1, 1, 4, 2]];
AddLabel[label_] := (AppendTo[plot[[1]],
Inset[Framed[label, Background -> White], pt]];
(* Remove buttons for final plot *)
plainplot = plot;
plainplot[[1, 1, 3, 2]] = plainplot[[1, 1, 3, 2, 1]];
plainplot[[1, 1, 4, 2]] = plainplot[[1, 1, 4, 2, 1]]);
plot[[1, 1, 3, 2]] = Button[sinline, AddLabel["Sin"]];
plot[[1, 1, 4, 2]] = Button[cosline, AddLabel["Cos"]];
Dynamic[EventHandler[plot,
"MouseDown" :> (pt = MousePosition["Graphics"])]]
Aby dodać kliknięcie etykiety na linii. Końcowy wykres z adnotacjami, ustawiony na "plainplot", można drukować i kopiować oraz nie zawiera on elementów dynamicznych.
[Później w ciągu dnia] Kolejna wersja, tym razem ogólna i oparta na początkowym wykresie. (W przypadku części używanych rozwiązania Mark McClure.) Dla różnych wykresów "ff" i "spec" można edytować zgodnie z potrzebami.
ff = {Sin, Cos, Tan, Cot};
spec = Range[0.1, 10, 0.1];
(* Plot functions separately to obtain line counts *)
plots = Array[ListLinePlot[ff[[#]] /@ spec] &, [email protected]];
plots = DeleteCases[plots, Line[_?(Length[#] < 3 &)], Infinity];
numlines = Array[[email protected][plots[[#]], Line[_], Infinity] &,
[email protected]];
(* Plot functions together for annotation plot *)
plot = ListLinePlot[#@spec & /@ ff];
plot = DeleteCases[plot, Line[_?(Length[#] < 3 &)], Infinity];
lbl = [email protected][ConstantArray[[email protected][[#]],
numlines[[#]]] &, [email protected]];
(* Line positions to substitute with buttons *)
linepos = Position[plot, Line, Infinity];
Clear[line];
(* Copy all the lines to line[n] *)
Array[(line[#] = plot[[Sequence @@ [email protected][[#]]]]) &,
[email protected]];
(* Button function *)
AddLabel[label_] := (AppendTo[plot[[1]],
Inset[Framed[label, Background -> White], pt]];
(* Remove buttons for final plain plot *)
plainplot = plot;
bpos = Position[plainplot, Button, Infinity];
Array[(plainplot[[Sequence @@ [email protected][[#]]]] =
plainplot[[Sequence @@ Append[[email protected][[#]], 1]]]) &,
[email protected]]);
(* Substitute all the lines with line buttons *)
Array[(plot[[Sequence @@ [email protected][[#]]]] = Button[line[#],
AddLabel[lbl[[#]]]]) &, [email protected]];
Dynamic[EventHandler[plot,
"MouseDown" :> (pt = MousePosition["Graphics"])]]
Oto jak to wygląda. Po adnotacji można znaleźć zwykły obiekt graficzny ustawiony na zmienną 'plainplot'.
Problem wzajemnego oddziaływania pomiędzy 'Mesh' i' PlotMarkers' był w [to SO pytanie] (http://stackoverflow.com/questions/4789047/custom-intervals-of-markers- in-mathematica-plotmarkers/4790805 # 4790805). Zgłosiłem to do WRI w tym czasie, a wsparcie techniczne przekazało to grupie rozwojowej. Mam nadzieję, że zostanie to naprawione w następnym wydaniu. – Simon
Jestem ciekawy, dlaczego niektóre opcje siatki działają, a wiele innych nie. –
Jeśli chodzi o trzecie pytanie, możesz zajrzeć do wykresu, którego użyłem tutaj: http://stackoverflow.com/questions/5745298/how-do-i-access-the-stackoverflow-api-from-mathematica/5745783 # 5745783. Obejmuje to ręczne adnotacje (które mogą być wykonywane półautomatycznie). Czuję, że efekt końcowy jest wizualnie o wiele przyjemniejszy niż wiele innych metod. –