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

Oxyplot - simple column chart - labels not appearing for highest value (ios but may happen in other systems)

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

lpinho wrote at 2014-01-09 15:46:

Hi,

I'm working with Xamarin and using this fantastic lib.
I'm using it for a few months without any problem, I'm now making my iPhone version of my application and when I plot it in the horizontal, the labels for the top value are not plotted/drawn.

I set the Frame background to green and the plot area background to white just to help to understand how I'm doing things.

Do you have any idea of what I can do to make these labels visible?
-Already tried to set padding and plot margins to 0 and I also tried not to set them at all.

Not working:

Image

Working:

Image

Code in draw method:
        public override void Draw(System.Drawing.RectangleF rect)
        {
            base.Draw(rect);

            KPIItemCollection dataSource = new KPIItemCollection();

            if (kpiCollectionPerTimeScale != null)
            {
                dataSource = GetSourceForChart();
            }

            UIColor selectedColor;
            string selectedFormat;
            Utilities.ColorAndFormatPicker(KPIType, out selectedColor, out selectedFormat);

            selectedColor = UIColor.FromRGBA(0f / 255f, 80f / 255f, 140f / 255f, 1.000f);

            PlotModel plotModel = new PlotModel();
            plotModel.TitleFont = "HelveticaNeue-Light";
            plotModel.Background = OxyColor.FromRgb(242, 242, 242);
            plotModel.PlotAreaBackground = OxyColors.White; //OxyColor.FromRgb(242, 242, 242);

            if (isPhone)
            {
                plotModel.PlotMargins = new OxyThickness(15, 0, 15, 20);
                plotModel.Padding = new OxyThickness(0, 0.25 * this.Frame.Height, 0, 0);
            }
            else
            {
                plotModel.Padding = new OxyThickness(0, 0.25 * this.Frame.Height, 0.08 * this.Frame.Width, 0);
            }
            plotModel.PlotAreaBorderThickness = 0;
            plotModel.Axes.Add(new CategoryAxis
            { 
                ItemsSource = dataSource, 
                LabelField = "Name", 
                AxislineStyle = LineStyle.Solid, 
                AxislineThickness = 0.1,
                GapWidth = 0.15,
                TickStyle = TickStyle.None,
            });

            if (isPhone)
            {
                plotModel.Axes[0].FontSize = 8;
            }

            plotModel.Axes.Add(new 
                        LinearAxis(AxisPosition.Left)
            { 
                IsAxisVisible = true,
                AxislineThickness = 1,
                TextColor = OxyColors.Transparent,
                TickStyle = TickStyle.None,
                AxislineColor = OxyColors.Transparent,

            });
            plotModel.DefaultFont = "HelveticaNeue-Light";


            plotModel.Series.Add(new ColumnSeries
            { 
                ItemsSource = dataSource, 
                ValueField = "Value", 
                FillColor = Utilities.FromUiColor(selectedColor), 
                LabelPlacement = LabelPlacement.Outside, 
                LabelFormatString = selectedFormat,
                FontSize = isPhone ? 10 : 20,
                TextColor = Utilities.FromUiColor(selectedColor),
            });

            plotModel.Update(true);
            var renderer = new MonoTouchRenderContext(UIGraphics.GetCurrentContext());
            plotModel.Render(renderer, rect.Width, rect.Height); 
}
Thanks for your help,

L. Pinho

objo wrote at 2014-01-10 09:17:

The labels of the ColumnSeries are clipped. I think the problem is the calculation of the actual max of the vertical axis. I have added issue
https://oxyplot.codeplex.com/workitem/10113

I think a workaround is to increase the MaximumPadding of the vertical axis.

objo wrote at 2014-01-10 09:18:

It's very cool to hear that it works well on iOS. Please post a link if you publish the app in the app store!

lpinho wrote at 2014-01-10 09:44:

Thanks for the workaround. I set its value to 0.05 and it looks good :)

Image

Thanks again for the help, I just love this library, I couldn't believe it when I found it, its flexible, it works and its free. This is a great asset for open source community.

Sure, when I publish it I will share it with you.
0

How to disable scroll in plotview?

Max S 10 ár síðan updated by Samuel Guedon 9 ár síðan 3
Hi,

I would like to disable the possibility to scroll/zoom in my plotview. I dont want the user to scroll/zoom away from the graph by misstake.

Is this possible?

How to make a plot fill its available area in WPF?

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

seveland12 wrote at 2013-04-11 17:07:

Nevermind. Tried to delete this comment, but this is the best I can do now.

Using DateTimeIntervalType.Manual

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

SteveReedSr wrote at 2014-07-07 05:25:

I want to be able to specify my DateTime labels specific to my date, so it seems the DateTypeIntervalType Manual is perfect for that. However, I can't find documentation as to how to use it.

My graphs display specific date ranges based upon user selection of 1 day, 3 day, 7 day, or 1 month. When 1 day is selected, I want ticks every 6 hours, when 3 day every 24 hours, etc.

I've seen an example where someone overrides the GetTickValues method, but it seems that the Axis is setup to allow manual values. But HOW?

I'm using Xamarin on Android, and the graphs work very well! Great tool, just need to do some minor tweaking of the labels and I'll be done!

SteveReedSr wrote at 2014-07-16 06:25:

I ended up doing this by overriding the GetTickValues method.

Plotting data stream received by a serial port

Oystein Bjorke 10 ár síðan updated by Emrah Duatepe 7 ár síðan 1
This discussion was imported from CodePlex

JohnnyPP wrote at 2012-11-01 21:27:

Hello,

 

I would like to plot data stream received by a serial port with sampling rate set to 1 Hz. Data stream is generated by a digital temperature sensor TMP102 connected to a microcontroller. The microcontroller sends the temperature values to the PC through serial port. In windows forms there is serial port control which I use to receive the data. All works well, with one exception the plot shows only last value received by the serial port. I am aware that the code I use right now is not optimized to draw a line between received points. I read other similar threads dealing with displaying real time data like:

http://oxyplot.codeplex.com/discussions/398856

http://oxyplot.codeplex.com/discussions/281036

http://oxyplot.codeplex.com/discussions/350457

I also looked at Realtimedemo and Refreshdemo. The answers and code are somehow confusing and complex (I am more involved in hardware than in software).

So my question is: how can I connect data points with a line? I would like to keep the code it as simple as possible.

 

Thanks in advance!

 

The code I use:

 

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="Form1.cs" company="OxyPlot">
//   http://oxyplot.codeplex.com, license: Ms-PL
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
 
 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System;
using System.Windows.Forms;
using OxyPlot;
using System.Globalization;    
 
namespace WindowsFormsDemo
{
    public partial class Form1 : Form
    {
   
        private int i = 0;
       
        public Form1()
        {
            InitializeComponent();
        
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.DtrEnable = true;
            serialPort1.Open();
            serialPort1.DataReceived += serialPort1_DataReceived;
        }
 
        private void button2_Disconnect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string line = serialPort1.ReadLine();
            this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
        }
 
 
        private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {
            double dTemperature, dTemperatureRound;
 
            try
            {

                dTemperature = double.Parse(line, CultureInfo.InvariantCulture);
                dTemperatureRound = Math.Round(dTemperature, 4);
 
                label1.Text = Convert.ToString(dTemperatureRound);
 
                var pm = new PlotModel("TMP102 digital temperature sensor""Temperature data stream")
                {
                    PlotType = PlotType.Cartesian,
                    Background = OxyColors.White,
                };
 
 
                var linearAxisX = new LinearAxis();
                linearAxisX.Title = "Sample number";
                linearAxisX.Position = AxisPosition.Bottom;
                linearAxisX.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
                linearAxisX.MajorGridlineStyle = LineStyle.Solid;
                linearAxisX.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
                linearAxisX.MinorGridlineStyle = LineStyle.Solid;
                pm.Axes.Add(linearAxisX);
 
                var linearAxisY = new LinearAxis();
                linearAxisY.Title = "Temperature [°C]";
                linearAxisY.Position = AxisPosition.Left;
                linearAxisY.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
                linearAxisY.MajorGridlineStyle = LineStyle.Solid;
                linearAxisY.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
                linearAxisY.MinorGridlineStyle = LineStyle.Solid;
                pm.Axes.Add(linearAxisY);
 
                var lineSeries1 = new LineSeries();
 
                lineSeries1.Color = OxyColor.FromArgb(255, 78, 154, 6);
                lineSeries1.MarkerFill = OxyColor.FromArgb(255, 78, 154, 6);
                lineSeries1.MarkerStroke = OxyColors.ForestGreen;
                lineSeries1.MarkerType = MarkerType.Circle;
                lineSeries1.StrokeThickness = 2;
                lineSeries1.DataFieldX = "Date";
                lineSeries1.DataFieldY = "Value";
 
                lineSeries1.Points.Add(new DataPoint(i, dTemperatureRound));
 
               
                pm.Series.Add(lineSeries1);
 
                plot1.Model = pm;
 
                i++;
            }
 
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

 


objo wrote at 2012-11-01 21:41:

I would suggest to create the PlotModel, axes and LineSeries in your form constructor. Call plot1.InvalidatePlot(true) to refresh. Something like this (not tested):

    public class Form1 : Form
    {
        private readonly LineSeries lineSeries1;

        private int i;

        public Form1()
        {
            InitializeComponent();

            var pm = new PlotModel("TMP102 digital temperature sensor", "Temperature data stream") { PlotType = PlotType.Cartesian, Background = OxyColors.White };

            var linearAxisX = new LinearAxis();
            linearAxisX.Title = "Sample number";
            linearAxisX.Position = AxisPosition.Bottom;
            linearAxisX.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
            linearAxisX.MajorGridlineStyle = LineStyle.Solid;
            linearAxisX.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
            linearAxisX.MinorGridlineStyle = LineStyle.Solid;
            pm.Axes.Add(linearAxisX);

            var linearAxisY = new LinearAxis();
            linearAxisY.Title = "Temperature [°C]";
            linearAxisY.Position = AxisPosition.Left;
            linearAxisY.MajorGridlineColor = OxyColor.FromArgb(40, 0, 0, 139);
            linearAxisY.MajorGridlineStyle = LineStyle.Solid;
            linearAxisY.MinorGridlineColor = OxyColor.FromArgb(20, 0, 0, 139);
            linearAxisY.MinorGridlineStyle = LineStyle.Solid;
            pm.Axes.Add(linearAxisY);

            this.lineSeries1 = new LineSeries();
            this.lineSeries1.Color = OxyColor.FromArgb(255, 78, 154, 6);
            this.lineSeries1.MarkerFill = OxyColor.FromArgb(255, 78, 154, 6);
            this.lineSeries1.MarkerStroke = OxyColors.ForestGreen;
            this.lineSeries1.MarkerType = MarkerType.Circle;
            this.lineSeries1.StrokeThickness = 2;
            this.lineSeries1.DataFieldX = "Date";
            this.lineSeries1.DataFieldY = "Value";
            pm.Series.Add(this.lineSeries1);
            plot1.Model = pm;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.DtrEnable = true;
            serialPort1.Open();
            serialPort1.DataReceived += this.serialPort1_DataReceived;
        }

        private void button2_Disconnect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string line = serialPort1.ReadLine();
            this.BeginInvoke(new LineReceivedEvent(this.LineReceived), line);
        }

        private void LineReceived(string line)
        {
            double dTemperature, dTemperatureRound;
            try
            {
                dTemperature = double.Parse(line, CultureInfo.InvariantCulture);
                dTemperatureRound = Math.Round(dTemperature, 4);
                label1.Text = Convert.ToString(dTemperatureRound);
                this.lineSeries1.Points.Add(new DataPoint(this.i, dTemperatureRound));
                plot1.InvalidatePlot(true);
                this.i++;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private delegate void LineReceivedEvent(string line);
    }

JohnnyPP wrote at 2012-11-01 22:20:

Thanks Objo,

it works!

0

[HeatMapSeries] having different max in Data and ColorAxis

Gingko 10 ár síðan 0
Hello,

I'd like to have different max (and min) in Data and ColorAxis.
Of course the colors should still be corresponding.
For example, the max Data value could be 50 (yellow) and the max of ColorAxis could be 100 (red)

Is that possible ?
Thx,
Gingko

Oxyplot apis

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

tantrum wrote at 2012-11-06 14:52:

Hi,

I am new to oxyplot i am finding it hard to find oxyplot apis.

Can anybondy help .

I work on visual studios.


objo wrote at 2012-11-06 19:57:

I recommend looking at the WPF examples - in Source\Examples\WPF

Start with the "SimpleDemo". Also see the "ExampleBrowser", it shows the source that creates all the plots (this is also useful if you use OxyPlot on other platforms).

Updates to the documentation/wiki pages are planned, but this will still take some time...

OxyPlot.Wpf 2013.1.32.1 cannot load System.Core 2.0.5.0

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

Jeltz wrote at 2013-02-16 02:55:

Have a VS2012 .net 4.5 WPF project using Oxyplot.WPF version 2012.5.2.1 (Installed using Nuget). All working fine, no problems.

Just used Nuget to update Oxyplot.WPF to 2013.1.32.1 and the wpf xaml now complains cannot load System.Core version 2.0.5.0 , so I have had to go back to the older Oxyplot version to fix it. Seems related to a Silverlight issue, but I do not and never have used Silverlight.

I can now confirm this happens between Oxyplot.WPF version 2013.1.10.1 which does not have this problem, and version 2013.1.11.1 which does have this problem.

Did this happen when Oxyplot went to a common library for Silverlight/WPF and has anyone else had this problem/hints to fix for latest Oxyplot release?

The problem happens even on a newly created fresh VS2012 WPF .Net 4.5 project with a fresh install of Oxyplot.

CMC wrote at 2013-02-16 04:07:

Yes, this problem has been seen. Please see "VS 2012 SimpleDemo: Plot won't render in WPF XAML Designer at Design Time" http://oxyplot.codeplex.com/discussions/431821. I have not tried the 2013.1.32.1 myself, but I think you are finding the issue remains after the adjustments made by objo.

Copy plot to clipboard with context menu

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

Gimly wrote at 2013-10-02 14:17:

I know that it's possible to copy a plot through the ctrl-c keyboard combination, but I'd like to make it a bit more obvious by setting a Context menu that has "Copy to clipboard".

I've seen in another thread that the Plot was bound to ApplicationCommands.Copy, so I thought that this would work:
<oxy:Plot>
                <oxy:Plot.ContextMenu>
                    <ContextMenu>
                        <MenuItem Command="ApplicationCommands.Copy" Header="Copy to clipboard" />
                    </ContextMenu>
                </oxy:Plot.ContextMenu>
</oxy:Plot>
But it doesn't work, when I right-click, the context menu is displayed correctly but the "Copy to clipboard" is disabled.

Any idea?

everytimer wrote at 2013-10-02 16:19:

See https://oxyplot.codeplex.com/discussions/455532
I don't know why but Commands do not work in the ContextMenu. If you want that you should use the click event and then send a message (with Messenger or Mediator) to your ViewModel (or copy the plot in the codebehind with the click event). Good luck.
0
Under review

Add padding/margin to LineSeries line between line and data point

Michael Splawski 9 ár síðan updated by Oystein Bjorke 9 ár síðan 1

Is there a way to add padding/margin to LineSeries line between line and data point

Here's a pooooorly Photoshop image of what I'm looking to achieve (The top LineSeries)Image 23