This is the discussion forum for OxyPlot.
For bugs and new features, use the issue tracker located at GitHub.
Also try the chat room!

Binding a cursor to a time source

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

drakesmith wrote at 2013-01-20 17:39:

I have created an audio waveform plot for a .wav player application. So far, OxyPlot has been fantastic for that. I use a vertical line annotation whose X position is bound to the playback position to track media position within the waveform. The position is updated every 100mS and the cursor looks great. The problem is that changing LineAnnotation.X at that rate uses 100% CPU.

Is there a better way to create a vertical position marker? A custom tracker seems close, but I want the cursor to move independently of the mouse. I don’t need any text or fancy graphic or mouse interaction, just a thin vertical cursor that overlays the plot.

Thank you.


objo wrote at 2013-01-22 09:34:

Yes, the whole model will be redrawn when changing an annotation. Check that you are not invalidating the data, no need to refresh data bindings when changing an annotation. Also see the Performance section under documentation.

In WPF, you could draw the cursor line in a canvas overlay above the plot control - subscribe to the axis changed events and use the transform methods on the axes to get the correct positions.


drakesmith wrote at 2013-01-22 10:50:

Thanks objo, your recommendation to use a canvas overlay is a reasonable workaround.

I will document those details and submit them back to you for inclusion in your documentation if you so choose.

Namespace prefix "oxy" not defined

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

morty77 wrote at 2013-09-25 12:42:

Hi there,

This might be a very basic question, but after installing OxyPlot.WPF (and OxyPlot.Core) in NuGet in a new VS 2012 project I can't see any oxyplot controls in the Toolbox. Neither can I add any XAML like in the WPF Example:
<oxy:Plot Model="{Binding MyPlotModel}"/>
Here the compiler complains about the namespace prefix "oxy" not being defined. Have I missed out something?

I would guess I would have to add a line similar to this in the Windows tag?
xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf"
However, when I do that, I get the error:
FileNotFoundException: Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.

The C# codebehind works fine.

Thanks.

loic_lopes wrote at 2013-09-25 14:29:

Have you tried to add a reference to System.Core?

morty77 wrote at 2013-09-26 09:34:

loic_lopes wrote:
Have you tried to add a reference to System.Core?
Hi there,
A reference to System.Core is already there. I tried to search for a System.Core.dll with version 2 but could not find it on my computer. I found 3.5 but I am not sure whether I should delete the existing reference and add this one.

By the way I am targeting .NET Framework 4.5 in my project, and I'm using Visual Studio 2012 Express for Windows Desktop.

objo wrote at 2013-09-26 10:00:

The core library is a Portable Class Library (PCL).
Is your VS 2012 Express up to date? Update 3 is needed for other versions of Visual Studio 2012.

morty77 wrote at 2013-09-26 10:19:

Hello,
Yes, it's got update 3. Full version number is 11.0.60610.01. Update 3.
I have VS 2010 also running on my computer. I might try to compile it there as well.

morty77 wrote at 2013-09-26 10:38:

Ok it's building and running without any errors in VS 2010 Professional. Although I have to check my code a bit as nothing is appearing in the Window when it is running. ;) Can't notice any OxyPlot specific controls in the Toolbox, but I'm not sure if there is supposed to be anything there?

VS 2012 Express still gets the error above.

morty77 wrote at 2013-09-26 10:51:

For some reason it is actually running now in VS 2012 Express! I used NuGet to update both the OxyPlot core and OxyPlot.Wpf to the most recent versions: 2013.1.88.1 (OxyPlot core was 2013.1.84.1). Don't know if it was that that fixed it. The XAML designer still gives the the same error message though, but at least it's running. Will modify the code to try to create a plot and see how it goes...

How to update a function plot?

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

aec wrote at 2012-08-21 14:52:

Hi,

I would like to create plot, which relys on a function rather than on data points. This plot should automatically be updated in case of a change of the x axis. For instance, this should be done when a user zooms out (or in).

Manually, I have done this with text boxes, where you type in xmin and xmax and the graph is updated via data binding. Maybe, it is possible to extend this idea by binding to the minimum and maximum of the x axis. But I don't know how to do this. Has anyone an idea how to tackle this problem?


objo wrote at 2012-08-21 15:46:

Subscribe to the AxisChanged event on the axis. The ActualMaximum and ActualMinimum values are updated before the event is raised, and these values can be used to update the limits of your function series. Then call PlotModel.Refresh(true) (since the plot data was modified) to update the plot. 


aec wrote at 2012-08-22 09:17:

Thank you, for your immediate response. I thnk, your solution works fine in case of a pure C# program. But what I like to have is a C#/WPF solution with MVVM pattern. That is, I have

1.) a model for the function f(x). The evaluation of this function yiels the Points and depends on the limits of x: XMin, XMax.

       public double XMin { get; set; }

       public double XMax { get; set; }

       public IList<DataPoint> Points{  get  {  return evaluatedPoints;  }  }

2.) a view model where OnPropertyChanged of the Points and the changed limit is raised.

       public IList<DataPoint> Points { get { return model.Points; } }

       public double XMax // same for XMin

       {

           get { return model.XMax; }

           set

           {

               model.XMax = value;

               OnPropertyChanged("XMax");

               OnPropertyChanged("Points");

          }

       }

3.) a WPF view where the axis properties are modified. With respect to XMax we have for instance

           <oxy:Plot.Axes>

               <oxy:LinearAxis Position="Bottom">

                   <oxy:LinearAxis.Maximum>

                       <Binding Mode="TwoWay"

                               Path="XMax"

                               Source="{StaticResource viewModel}"

                               UpdateSourceTrigger="PropertyChanged" />

                   </oxy:LinearAxis.Maximum>

               </oxy:LinearAxis>

           <oxy:Plot.Axes/>

 

The problem is that there is no dependency property for ActualMaximum and ActualMinimum. Of course, I could implement this. But I don't like this approach, because than I am modifying your library. As a consequence I have to do this modification for all future versions.

To this end, I would like to ask you, if you can do this?



objo wrote at 2012-08-24 09:12:

I think it could be possible to add an AxisChanged routed event on the OxyPlot.Wpf.LinearAxis. This could pass the events from the OxyPlot.LinearAxis. http://oxyplot.codeplex.com/workitem/9992

It should also be possible to make some read-only dependency properties for ActualMaximum/ActualMinimum, which may get change notifications every time the plot is changed (e.g. panned, zoomed or data changed). http://oxyplot.codeplex.com/workitem/9993


aec wrote at 2012-08-24 11:00:

Hi objo, that would be cool! I am looking forward to this feature!

0
Under review

Zoom not available on axis after switching visibility

Xavier Hahn 10 ár síðan updated by some individuum 9 ár síðan 3
I'm not quite sure if this is a bug or I have overlooked something, if it is a bug I'll create an issue in NuGet.

Basically, I'm trying to have a feature that allows the user to switch an axis between linear and logarithmic. As suggested by Oystein in gitter, I've created the 2 Axes (one log, one lin), set one to invisible and the other to true and put my series by default to the visible one. Then, when my user clicks on something, I set the visible one to invisible vice versa and switch my series to the visible one.

It works pretty well, but neither the zoom nor the pan on the linear axis is working. I'm wondering if there is something to set at the level of the PlotModel to tell him which axis should be panned & zoomed, but I can't find any option.

Here's my code that does the switch for reference (in a setter of a property, hence the "value"):
var logAxis = this.MyPlot.Axes.Single(x => x.Key == "LogAxis");  
var linAxis = this.MyPlot.Axes.Single(x => x.Key == "LinAxis");

linAxis.IsZoomEnabled = linAxis.IsPanEnabled = linAxis.IsAxisVisible = !value;
logAxis.IsZoomEnabled = logAxis.IsPanEnabled = logAxis.IsAxisVisible = value;

this.MyPlot.Series.Apply(
	s =>  
	{
var series = s as XYAxisSeries; if (series != null) { if (value) { series.XAxisKey = "LogAxis"; } else { series.XAxisKey = "LinAxis"; } } });

disable zooming

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

steunissen wrote at 2011-07-19 10:49:

First I have to say I absolutely love this great tool !

And I have a question ;-)

When I am on a chart and I want to scroll down (the chart is in a listview) the chart zooms as well. But I want the chart to be fixed, thus disabling the zoom functionality... Can I do this ?

 

Sander.


objo wrote at 2011-07-19 13:43:

hi Sander, you can set IsZoomEnabled = false to each of your axes, I think this is what you need!


steunissen wrote at 2011-07-19 17:35:

objo wrote:

hi Sander, you can set IsZoomEnabled = false to each of your axes, I think this is what you need!

Ah, I found it...

I was defining my axes in wpf, but there is no IsZoomEnabled property available.

Now I define my axes in code and IsZoomEnabled is available.

The OxyPlot and OxyPlot.WPF namespaces have more or less different objects with identical names... I found that a bit confusing...

 


objo wrote at 2011-07-20 21:50:

Right, all properties are not yet available in the WPF/SL classes, but this is planned (I hope to be able to share the code on both platforms). I understand it can be a bit confusing with identical names and the two different ways to define the plots, but there are advantages with both methods, so I think it should be kept that way. 

Help using scatter plot and Heatmap in Oxyplot winform

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

Meyip wrote at 2013-04-02 07:25:

Hi everyone, I'm a newbie to C# (coming from C and C++). I found Oxyplot's examples to be of some help. But would rather ask the following, since I've spent days searching and can't find an answer.

Here's what I'm trying to do.
Create a C# Winform App to graph data from the serial port on a Scatter Plot, then a Heat map using Oxyplot.

I've gotten my C# program to read the serial data and output a multidimensional integer array in the form (int[x,y]). Now after copying the code from the Oxyplot example files in the downloads section, all I see when I run the code is a plain graph. How do I graph data from my multidimensional array into the Scatter and HeatMap graphs? The code bellow is what I'm currently dealing with in regards to Oxyplot. Thanks ahead for you help.
  //   [Example("ScatterSeries with random MarkerSize (n=1000)")]

            var plotModel1 = new PlotModel();
            plotModel1.Subtitle = "BinSize = 8";
            plotModel1.Title = "ScatterSeries with random MarkerSize (n=1000)";
            var linearAxis1 = new OxyPlot.Axes.LinearAxis();
            linearAxis1.Position = OxyPlot.Axes.AxisPosition.Bottom;
            plotModel1.Axes.Add(linearAxis1);
            var linearAxis2 = new OxyPlot.Axes.LinearAxis();
            plotModel1.Axes.Add(linearAxis2);
            var scatterSeries1 = new OxyPlot.Series.ScatterSeries();
            scatterSeries1.BinSize = 8;
            scatterSeries1.MarkerStrokeThickness = 0;
            scatterSeries1.Title = "Series 1";
            plotModel1.Series.Add(scatterSeries1);
            // return plotModel1;
       


            plot1.Model = plotModel1;

Meyip wrote at 2013-04-04 16:34:

Never mind, I was able to view what I needed by reviewing different code from different examples. Great job on putting together Oxyplot. Good luck.

line annotation does not work with y-axis set to my own custom axis

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

chage wrote at 2013-06-13 18:41:

Hi objo,
I create a custom axis (derived from Axis), and overrides below methods:
1) GetTickValues
2) IsValidValue
3) IsXyAxis
4) Transform

the custom axis appear to work well on the plot as axis Y (this axis has pan and zoom disabled always). However I later found out that when I add vertical line annotation, it will not show in the plot. Horizontal line annotation works well on the other hand.

Is there anything that is depending on axis-Y (my custom axis) when I add vertical line annotation?

chage wrote at 2013-06-14 20:36:

I have found the reason why the line annotation wasnt rendered however the fix is still something that I will research further later as I need to move on to other thing now. Will post the code changes and some suggestion later. Thanks objo.

What would be the best way to handle legend overflow?

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

typingcat wrote at 2012-10-11 06:56:

Hello.

When there are many plots, and their name is long, and the size of OxyPlot is small, legend overflows. It is drawn outside of OxyPlot, which makes my program look defective.

What options do I have? Can I make it not overflow outside of OxyPlot?


objo wrote at 2012-10-12 07:40:

Can you put the legends below the plot?

I added the issue http://oxyplot.codeplex.com/workitem/10009

How to show a OxyPlot in a PictureBox controller in WindowsForms?

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

huangzhqin wrote at 2014-05-20 19:03:

I tried to show the OxyPlot results in a PictureBox controller, however, it did not work.
Should the OxyPlot only been shown in Forms? (I used the OxyPlot.WindowsForms.)

Using line series as annotation

Oystein Bjorke 10 ár síðan 0
This discussion was imported from CodePlex

Gimly wrote at 2013-09-19 12:19:

Hello,

I would like to use annotations in the same way as the scatter example with least square fit, but with a polynomial fit.

I thought that I could use the "Equation" of the LineAnnotation, but the equation is too complex to define as I'm doing a graph that does a 2D representation of a 3D graph.

Is there a way to define the LineAnnotation with points, as we would do for the LineSeries?
Is there another way I could do that?

A "hack" that I tought would be to simply create LineSeries for my fit, but then when I click on the line I get the value of the fit, which I don't want. Can we remove the popup that displays when we click on the line?

objo wrote at 2013-09-20 09:05:

The LineAnnotation is intended for straight lines.
I think a PolylineAnnotation should be created for polylines, and the implementation should be much easier than the LineAnnotation :)

Gimly wrote at 2013-09-20 11:19:

You say that the line annotation is intended for straight lines, but I can easily do this:
LineAnnotation lineAnnotation = new LineAnnotation()
{
       Equation = (double x) => { return Math.Sin(x); },
       Type = LineAnnotationType.EquationY
};
And it gives me a nice sinusoid, doesn't seem to be any issue with displaying curves and the like.

I'll give a try at creating a PolylineAnnotation, will give me an excuse to dive into the code as I will probably have reason to do some changes for my needs in the future :).

Otherwise, is there a way to remove the popup that gives the value when we click for some specific series?

Thanks for your answer!

objo wrote at 2013-09-20 11:27:

Right, I forgot that :)
I think that feature should be removed from the LineAnnotation, and suggest to create a subclass FunctionAnnotation!