Oxyplot Xamarin.Forms Version
rmarinho wrote at 2014-07-23 23:34:
So Xamarin has this new platform that is Xamarin.Forms, it's pcl based, and me and others have a open source project to share some common functionally not present yet in the platform : https://github.com/XForms/Xamarin-Forms-Labs
One of the features i thought about working on that project was Simple Chart support:
https://github.com/XForms/Xamarin-Forms-Labs/issues/38
After finding about Oxyplot and that it has all the platform support that Xamarin Forms needs, IOS; Android; WP8, i think this can be used also in Forms if we just work on some wrappers.
So what i wanted to discuss, if it sounds good to work in a new branch here for Xamarin.Forms support.
Thanks.
Best Regards
Rui
CraigD wrote at 2014-07-25 19:54:
Example for touch in Win7?
jhudson216 wrote at 2014-06-19 20:18:
I've just obtained the OxyPlot.WPF package, which I'm trying to use in VS2010. I created the trivial application (just a PlotView in a Grid in a Window, with a bit of view-model code to load up a PlotModel, a couple of axes and a series). It displays quite nicely.
However, when I touch within the window (I have a touch-monitor), it immediate crashes with a NullReference Exception in PlotView.OnManipulationStarted. I'm assuming that I haven't wired up the manipulation features correctly, but I cannot find a demo for this. The "Code" button in the browser examples only show the function that builds the PlotModel. Where can I find a FULL example of a touch-enabled OxyPlot application?
Many thanks!
Jim Hudson
When Using WPF from NUGET I get an Assembly Mismatch Error
DrStrangeLove wrote at 2013-09-11 17:18:
Assembly 'OxyPlot.Wpf, Version=2013.1.80.1, Culture=neutral, PublicKeyToken=75e952ba404cdbb0' uses 'OxyPlot, Version=2013.1.80.1, Culture=neutral, PublicKeyToken=638079a8f0bd61e9' which has a higher version than referenced assembly 'OxyPlot, Version=2013.1.74.1, Culture=neutral, PublicKeyToken=638079a8f0bd61e9'
objo wrote at 2013-09-11 19:55:
objo wrote at 2013-09-11 23:31:
Metro build errors - Payload file does not exist
rajah wrote at 2012-10-19 05:32:
Here is something odd that i am finding:
When I reference the "OxyPlot.dll" and the "OxyPlot.Metro.dll" and try and build my project, I get the following error:
Error 1 Payload file 'D:\Development\OxyPlot\Source\OxyPlot.Metro\bin\Debug\OxyPlot.Metro\Themes\Generic.xaml' does not exist. App1
The error goes away if I add the projects directly to my solution and reference the projects instead of the dlls.
It looks like multiple people are having this issue (eg: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/b20ca4a5-8293-4da7-859e-6759a2a76f9d), though I havent found a solution that fixes this issue.
Anybody else out here who has figured out a solution for this?
objo wrote at 2012-10-19 05:54:
It seems to work for Callisto, but I could not find out why...
aazavvar wrote at 2013-09-26 09:07:
Scatter Series and Date Time axis
willmoore88 wrote at 2013-07-24 16:29:
Jasper1986 wrote at 2013-10-20 17:23:
var s2 = new ScatterSeries
{
Title = "testScatter",
DataFieldX = "Time",
DataFieldY = "Value",
ItemsSource = data
};
however, i can't compile the codes above with current dlls, it seems something is wrong when cast datetime to double._Noctis_ wrote at 2013-10-21 06:23:
Here's a screenshot:
I'm using something along:
X = DateTimeAxis.ToDouble(your_date_here)
when adding the points... seems to work.Cannot create WPF control
starrynite1959 wrote at 2012-07-19 23:29:
This looks like a great tool, but I'm having a hard time getting to first base. I'm a newbie with WPF, though. I'm using VS 2010, and used NuGet to install the OxyPlot packages into my project. OxyPlot, OxyPlot.Wpf and others now show up in my References.
The second bullet step I'm to do is to "Create a PlotModel in your ViewModel." What the heck is a ViewModel?
In my XAML, I added a line
xmlns:oxy="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf"
in my Window element. Then in my Grid element beneath, I added
<oxy:Plot Model="{Binding myPlotModel}" Height="401" HorizontalAlignment="Left" Margin="222,12,0,0" VerticalAlignment="Top" IsEnabled="False" Background="#FFF2F296" BorderThickness="1" Width="573"/>
Then back in my MainWindow c# code, I added the WPFExample1 code you have, but when I build it complains that 'myPlotModel' does not exist in the current context. I then added a Name="myPlotModel" attribute in the XAML and it no longer complained,
but in the last line -- myPlotModel = temp; -- it gave me a type conversion error, saying that it can't convert OxyPlot.PlotModel to OxyPlot.Wpf.Plot.
I'm guessing I'm doing some basic VS or C# mis-step, that has nothing to do with OxyPlot, but I've played around with OxyPlot and OxyPlot.Wpf references and I get one error or another.
Sorry for taking your time on a noob question, but what am I doing wrong in the package references and/or XAML?
Thanx.
starrynite1959 wrote at 2012-07-24 18:36:
So the "ViewModel" referred to is the new MVVM religion?
asychow wrote at 2012-07-27 11:36:
Plot and PlotModel are completely different. You can't assign an instance of PlotModel to a Plot.
You should define myPlotModel in a ViewModel and assign the DataContext of the View (the MainWindow) to the ViewModel.
For more details, refer to the examples in the source code.
starrynite1959 wrote at 2012-07-27 14:54:
Yeah, somehow I missed a statement on oxyplot.codeplex.com that there were examples in the Source Code. I figured that out two days ago and have been playing. The code above that I tried to use was based on what is shown on oxyplot.codeplex.com/wikipage?title=WpfExample1&referringTitle=Home. Thanx.
objo wrote at 2012-08-09 00:13:
Yes, most WPF/SL examples are using the MVVM design pattern. I will not add examples using named plot controls (even if it is possible) as I don't think this is good practice.
Will try to improve the 'getting started' documentation as soon as I get time!
_Noctis_ wrote at 2013-11-05 13:42:
objo wrote at 2013-11-05 18:55:
_Noctis_ wrote at 2013-11-06 03:40:
Nobody likes writing documentation, everybody loves reading it and complains if it's not there ...
That's what differentiates good code from bad code ...
Having said that, how could I help?
objo wrote at 2013-11-06 23:04:
~/Documentation
folder. Create a fork and make a pull request when ready. The build machine will convert the wiki files to html, chm and pdf, and upload to
http://oxyplot.org/doc. The API documentation will be generated from the XML comments and also included there. This should make everything googlable!Captions Above Datapoints
bigN13 wrote at 2013-06-19 15:20:
sample.Points.Add(new DataPoint(x, y));
Is it Possible?
Thanks
objo wrote at 2013-06-19 20:42:
michaeldjackson wrote at 2013-07-24 20:38:
I accomplished this by using TextAnnotations.
It's slows the plot down somewhat, but still usable for my purpose.
exporting plot to png.
vdepa wrote at 2012-03-02 12:13:
Hi all,
Can anyone please share code for exporting plot to png from the step onwards.
It's very urgent to me.
Please help.
ffiala wrote at 2012-03-02 22:40:
This is my file "BitmapRenderContext.cs" which is originally copied from SvgRenderContext.cs substituting the calls to svg writer through calls to Graphic class. This Class returns a Bitmap.
// -------------------------------------------------------------------------------------------------------------------- // // http://oxyplot.codeplex.com, license: Ms-PL // // -------------------------------------------------------------------------------------------------------------------- namespace OxyPlot { using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; /// /// The Bitmap render context. /// public class BitmapRenderContext : RenderContextBase, IDisposable { #region Constants and Fields public Bitmap objBmpImage; Graphics objGraphics; #endregion #region Constructors and Destructors /// /// Initializes a new instance of the class. /// /// <param name="s" /> /// The s. /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// /// <param name="isDocument" /> /// The is document. /// public BitmapRenderContext(double width, double height) { this.Width = width; this.Height = height; this.PaintBackground = true; objBmpImage = new Bitmap((int)width, (int)height); objGraphics = Graphics.FromImage(objBmpImage); objGraphics.Clear(Color.White); objGraphics.SmoothingMode = SmoothingMode.AntiAlias; objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias; } #if !METRO /// /// Initializes a new instance of the class. /// /// <param name="path" /> /// The path. /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// public BitmapRenderContext(string path, double width, double height) { } #endif #endregion #region Public Methods /// /// The close. /// public void Close() { } /// /// The complete. /// public void Complete() { } /// /// The dispose. /// public void Dispose() { objBmpImage.Dispose(); } /// /// The draw ellipse. /// /// <param name="rect" /> /// The rect. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness) { Pen pen = stroke == null ? null : new Pen(Color.FromArgb(stroke.A, stroke.R, stroke.G, stroke.B), (int)thickness); Rectangle grect = new Rectangle((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (pen != null) objGraphics.DrawEllipse(pen, grect); if (brush != null) objGraphics.FillEllipse(brush, grect); } /// /// The draw line. /// /// <param name="points" /> /// The points. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// /// <param name="dashArray" /> /// The dash array. /// /// <param name="lineJoin" /> /// The line join. /// /// <param name="aliased" /> /// The aliased. /// public override void DrawLine( IList points, OxyColor stroke, double thickness, double[] dashArray, OxyPenLineJoin lineJoin, bool aliased) { Point[] Gpoints = new Point[points.Count]; for (int i=0; i /// The draw polygon. /// /// <param name="points" /> /// The points. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// /// <param name="dashArray" /> /// The dash array. /// /// <param name="lineJoin" /> /// The line join. /// /// <param name="aliased" /> /// The aliased. /// public override void DrawPolygon( IList points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, OxyPenLineJoin lineJoin, bool aliased) { Point[] Gpoints = new Point[points.Count]; for (int i = 0; i < points.Count; i++) { Gpoints[i].X = (int)points[i].X; Gpoints[i].Y = (int)points[i].Y; } Pen pen = stroke == null ? null : new Pen(Color.FromArgb(stroke.A, stroke.R, stroke.G, stroke.B), (int)thickness); if (pen != null) objGraphics.DrawPolygon(pen, Gpoints); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (brush != null) objGraphics.FillPolygon(brush, Gpoints); } /// /// The draw rectangle. /// /// <param name="rect" /> /// The rect. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness) { Pen pen = stroke==null ? null : new Pen(Color.FromArgb(stroke.A,stroke.R,stroke.G,stroke.B), (int)thickness); Rectangle grect = new Rectangle((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (pen!=null) objGraphics.DrawRectangle(pen, grect); if (brush != null) objGraphics.FillRectangle(brush, grect); } /// /// The draw text. /// /// <param name="p" /> /// The p. /// /// <param name="text" /> /// The text. /// /// <param name="c" /> /// The c. /// /// <param name="fontFamily" /> /// The font family. /// /// <param name="fontSize" /> /// The font size. /// /// <param name="fontWeight" /> /// The font weight. /// /// <param name="rotate" /> /// The rotate. /// /// <param name="halign" /> /// The halign. /// /// <param name="valign" /> /// The valign. /// /// <param name="maxSize" /> /// Max size of the text (clipping rectangle). /// public override void DrawText( ScreenPoint p, string text, OxyColor c, string fontFamily, double fontSize, double fontWeight, double rotate, HorizontalTextAlign halign, VerticalTextAlign valign, OxySize? maxSize) { double SizeCorrectingFactor = 0.8; double VerticalCorrectingFactor = fontSize * 0.3; Point Gp = new Point((int)(p.X-VerticalCorrectingFactor), (int)(p.Y)); Font font = new Font(fontFamily,(float)(fontSize*SizeCorrectingFactor), FontStyle.Regular); SolidBrush brush = c == null ? null : new SolidBrush(Color.FromArgb(c.A, c.R, c.G, c.B)); StringFormat stringFormat = new StringFormat(); /* dont know how to vertically align text, so this setting is skipped */ if (brush != null) { if (Math.Abs(rotate) < 0.1) { switch (halign) { case HorizontalTextAlign.Center: stringFormat.Alignment = StringAlignment.Center; break; case HorizontalTextAlign.Left: stringFormat.Alignment = StringAlignment.Near; break; case HorizontalTextAlign.Right: stringFormat.Alignment = StringAlignment.Far; break; } objGraphics.DrawString(text, font, brush, Gp, stringFormat); } else { switch (halign) { case HorizontalTextAlign.Center: stringFormat.Alignment = StringAlignment.Center; break; case HorizontalTextAlign.Left: stringFormat.Alignment = StringAlignment.Near; break; case HorizontalTextAlign.Right: stringFormat.Alignment = StringAlignment.Far; break; } stringFormat.Alignment = StringAlignment.Far; SizeF size = objGraphics.MeasureString(text, font); Bitmap tempImage = new Bitmap((int)(size.Height * 1.2), (int)(size.Width * 1.2)); Graphics tempGraphics = Graphics.FromImage(tempImage); tempGraphics.TextRenderingHint = TextRenderingHint.AntiAlias; tempGraphics.SmoothingMode = SmoothingMode.AntiAlias; Rectangle rect = new Rectangle((int)tempGraphics.VisibleClipBounds.X, (int)tempGraphics.VisibleClipBounds.Y, (int)tempGraphics.VisibleClipBounds.Width, (int)tempGraphics.VisibleClipBounds.Height); tempGraphics.TranslateTransform(0, 0); tempGraphics.RotateTransform(270); tempGraphics.DrawString(text, font, brush, new PointF(0, 0), stringFormat); objGraphics.DrawImage(tempImage, Gp); objGraphics.DrawImage(tempImage, Gp); tempGraphics.Dispose(); tempImage.Dispose(); } } } /// /// The flush. /// public void Flush() { objGraphics.Flush(); } /// /// The measure text. /// /// <param name="text" /> /// The text. /// /// <param name="fontFamily" /> /// The font family. /// /// <param name="fontSize" /> /// The font size. /// /// <param name="fontWeight" /> /// The font weight. /// /// /// public override OxySize MeasureText(string text, string fontFamily, double fontSize, double fontWeight) { if (string.IsNullOrEmpty(text)) { return OxySize.Empty; } // todo: should improve text measuring, currently using p/invoke on GDI32 // is it better to use winforms or wpf text measuring? return Gdi32.MeasureString(fontFamily, (int)fontSize, (int)fontWeight, text); } #endregion } }
In PlotModel.cs the following method is added:
/// /// Create a Drawing /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// /// <param name="isDocument" /> /// if set to true [is document]. /// /// /// The to svg. /// public Bitmap ToBitmap(double width, double height) { var bmrc = new BitmapRenderContext(width, height); this.Update(); this.Render(bmrc); bmrc.Complete(); bmrc.Flush(); return (bmrc.objBmpImage); }
To send the image to the client:
Response.Clear(); Response.ContentType = "image/png"; Bitmap bmp = plot.GetBitmap(800, 500); bmp.Save(Response.OutputStream, ImageFormat.Png);
In this version only solid lines are rendered.
Franz
vdepa wrote at 2012-03-06 19:06:
Hi fmoses,
I am unable to save the png. The above code is not working at the draw line.
I writting the below sample code for testing. I have used plot model and plot as in the example
Can you please correct the mistake in the below code. XAML Code:
C# Code :
using OxyPlot;
using OxyPlot.Wpf;
try
{
InitializeComponent(); Model = TwoLineSeries();
DataContext = this; Plot objPlot = this.plot1;
var path = GetFilename(".png files|*.png", ".png");
if (path != null) { objPlot.SaveBitmap(path); } } catch (Exception ex) { string abc = ex.Message.ToString(); }
public static PlotModel TwoLineSeries()
{
var model = new PlotModel();
OxyPlot.LinearAxis abcd = new OxyPlot.LinearAxis();
abcd.Key = "Hours";
abcd.Position = AxisPosition.Left;
abcd.Title = "Hours";
abcd.MajorGridlineStyle = LineStyle.Solid;
model.Axes.Add(abcd);
OxyPlot.LinearAxis abc = new OxyPlot.LinearAxis();
abc.Key = "Men";
abc.Position = AxisPosition.Bottom;
abc.Title = "Men"; model.Axes.Add(abc);
var s1 = new OxyPlot.LineSeries("Series 1")
{
Color = OxyColors.SkyBlue, };
s1.YAxisKey = abcd.Key; for (int i = 0; i < 300; i++)
{
s1.Points.Add(new DataPoint(i, i + 10));
}
model.LegendPlacement = LegendPlacement.Outside;
model.LegendOrientation = LegendOrientation.Horizontal;
return model;
Please help me.
Thanks & Regards
vdepa
Printing OxyPlot example in WinForm
heromyth wrote at 2011-10-20 05:13:
Here are some code snippets for Printing OxyPlot.
The OxyPlot can be printed into a partial section in the cava.
There also including another way exporting the OxyPlot to PNG.
======================================= private void printPreviewBtn_Click(object sender, EventArgs e) { PrintPreviewDialog ppd = new PrintPreviewDialog(); ppd.Document = reportPrintDocument; ppd.ShowDialog(); } private void reportPrintDocument_PrintPage(object sender, PrintPageEventArgs e) { Graphics graphBoard = e.Graphics; float sectionWidth = e.PageBounds.Width; PointF strLocation = new PointF(); strLocation.X = 50f; strLocation.Y = 50f; graphBoard.DrawString("Test Text",new Font("Tahoma", 16, FontStyle.Bold), Brushes.Black, strLocation); int width = (int)sectionWidth - 10; int height = 300; width = plot1.Width; height = plot1.Height; Bitmap bm = new Bitmap(width, height); plot1.DrawToBitmap(bm, new Rectangle(0,0,width,height)); bm.Save("C:\\test.bmp"); bm.Save("C:\\test.png", ImageFormat.Png); graphBoard.DrawImage(bm, new Point(50, 150)); } }
objo wrote at 2011-10-20 08:05:
thank you, I will include this in one of the examples!
(I think the definintion of reportPrintDocument is missing in your code)
heromyth wrote at 2011-10-20 13:21:
objo wrote:
thank you, I will include this in one of the examples!
(I think the definintion of reportPrintDocument is missing in your code)
reportPrintDocument = new System.Drawing.Printing.PrintDocument();
You can drag a PrintDocument control from the VS's Toolbox
ToSvg
nicolasr75 wrote at 2013-05-16 02:59:
I'm trying to export an oxyplot to svg using the PlotModel.ToSvg() method. However, I don't quite understand the parameters.
What does the "isDocument" parameter mean?
What does the "textMeasurer" parameter mean?
An example on how to use the method would be great!
Thanks for any idea.
Nick
nicolasr75 wrote at 2013-05-17 23:46:
Nick
objo wrote at 2013-06-08 12:00:
textMeasurer - the svg render context needs to measure the size of text. You need to provide a platform specific render context that can do this since the core library does not have access to any methods that can measure text
LazyJames wrote at 2013-07-01 11:20:
I am exporting the plot to a HTML5 svg tag. I am not using silverlight or WPF. I need to be able to generate a textMeasurer for this. I have looked through the tests source code and can not find an example of this apart from the silverlight and WPF ones.
If anyone could point me in the correct direction i would be grateful.
objo wrote at 2013-07-02 14:54:
You could also create a render context using p/invoke to gdi32 to measure the strings
http://www.pinvoke.net/default.aspx/gdi32/gettextextentpoint.html
It would be great to know better solutions to this...
Roark wrote at 2013-09-19 01:59:
' -------------------------------------------------------------------------------------------
' <copyright file="GraphicsRenderContext.cs" company="OxyPlot">
' The MIT License (MIT)
'
' Copyright (c) 2012 Oystein Bjorke
'
' -------------------------------------------------------------------------------------------
Imports OxyPlot.WindowsForms
Namespace OxyPlot.WindowsForms
''' <summary>
''' The graphics render context.
''' </summary>
Public Class GraphicsRenderContext
Inherits RenderContextBase
Then I was able to do this:Dim rc As New GraphicsRenderContext
Dim bmpOut As System.Drawing.Bitmap = New System.Drawing.Bitmap(800, 600)
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmpOut)
rc.SetGraphicsTarget(g)
Dim svg As String = MyPlot.ToSvg(800, 600, False, rc)
Service d'assistance aux clients par UserEcho