2012-08-03 21 views
5

Ho un controllo ZedGraph con poche curve al suo interno e voglio aggiungere linee verticali ad alcune posizioni x fisse. Le linee dovrebbero ovviamente essere solo all'interno dell'area del grafico reale.Linee verticali ZedGraph con problema LineObj

Ho cercato seguente

LineObj line = new LineObj(Color.Black, xPos, myPane.YAxis.Scale.Min, xPos, myPane.YAxis.Scale.Max); 
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 
myPane.GraphObjList.Add(line); 

e questo funziona bene finché l'utente ingrandisce il grafico, le linee verticali saranno quindi allungare dell'area del grafico effettivo (vedi link pic sotto, anche notare che non è tratteggiata all'interno del grafico, dispari).

http://imageshack.us/photo/my-images/196/zedgraphzoom.png/

C'è un modo per risolvere questo (se solo ci fosse aa modo per ottenere myPane.Xaxis.Scale.Min e Max del zoom corrente e quindi aggiornare il grafico nella ZoomEvent?) O sono Esistono classi/metodi migliori da utilizzare diversi da LineObj per questo scopo?

risposta

2

Invece di definire un LineObj, definire un LineItem e aggiungerlo alla GraphPane.CurveList:

LineItem line = new LineItem(String.Empty, new[] { xPos, xPos }, 
       new[] { myPane.YAxis.Scale.Min, myPane.YAxis.Scale.Max }, 
       Color.Black, SymbolType.None); 
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 

myPane.CurveList.Add(line); 

Questo si lega line al sistema di coordinate nel riquadro grafico, in modo che quando si esegue lo zoom o la panoramica posizione line sarà essere ancora confinati nel grafico. Naturalmente, se si riduce lo zoom senza aggiornare i valori 10 di line, le estremità line si troveranno all'interno del grafico.

So per esperienza personale che il tratteggio può essere un problema in Zedgraph; tuttavia sembra che il tratteggio sia visualizzato correttamente quando si aggiunge uno LineItem, tuttavia.

+0

Funziona bene fino a quando tu non chiamare zedGraphControl.AxisChange() afterwords, nel qual caso si aggiungerà margine in fondo, ma credo che si può fare tutto ciò che richiede quella chiamata prima di aggiungere le linee. Grazie! – HischT

+2

Una soluzione consiste nel creare un asse Y secondario, quindi inserire la scala scale.max e min su entrambi 0 e 1, quindi collegare LineItem ad esso con due punti (x, 0) e (x, 1). In questo modo, rimane indipendente dall'asse opposto. – Larry

2

Eri sulla buona strada usando un LineObj piuttosto che un CurveItem.

Dai un'occhiata alla struttura Location e alla proprietà CoordinateFrame. Permette di utilizzare un sistema di coordinate diverso per X e/o Y.

Impostazione CoordinateFrame per XScaleYChartFraction permette di utilizzare 0d e 1d come Y, che significa "basso" e "alto" del riquadro grafico (invece di YAxis.Scale.Min e YAxis.Scale.Max), mentre X continua a utilizzare il sistema di coordinate della scala X Axis.

Ciò significa che è possibile utilizzare .AxisChange(), zoom, panoramica e LineObj non interferirà con i cambiamenti di scala dell'asse Y!

var line = new LineObj(Color.Black, xPos, 0, xPos, 1); 

line.Location.CoordinateFrame = XScaleYChartFraction; // This do the trick ! 
line.IsClippedToChartRect = true; 

line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 

myPane.GraphObjList.Add(line); 
+0

Questo sembra un modo molto migliore di aggiungere un oggetto LineItem, perché le linee verticali sono concettualmente diverse dalle curve dei dati. – ricovox

+0

La mia ricerca è finalmente finita. – KDecker

Problemi correlati