绘制图表 - 仅显示单个点

时间:2017-02-21 07:24:09

标签: c# wpf gnuplot coordinate-systems oxyplot

WPF的C#应用​​程序

我有一个问题,我必须“画”一个坐标系,只输入坐标(没有线),如图所示。

Here you can see the coordinate system with the points. Later, only the coordinates with a circle or a point are to be specified.

我想使用一个库,因为我还必须绘制一个框架,我想用一个库会很容易。 所以我发现了GnuPlot,Oxyplot并自己画画。不幸的是,GnuPlot是愚蠢的,因为它没有C#应用程序的库。 (或者,如果你有一个,请告诉我)。因此,我使用了OxyPlot,但遗憾的是OxyPlot只显示了坐标系。 现在问我的问题。 用坐标绘制坐标系有什么好处吗? 它应符合以下要求:

  • 它应该是一个预览应用程序,也就是说,如果我改变它应该直接发生的大小
  • 我想制作一个框架,所以它应该在这个过程中帮助我
  • 应该有一个图书馆
  • 应该是C#应用程序
  • 我想成为X,Y坐标的第一个点标记,但后来应该是圆直径的圆
  • 稍后作为位图

如上所述,我已将它与OxyPlot一起使用,但不幸的是它没有绘制图形(我使用了示例文档)

也许你对OxyPlot有更好的想法/解决方案。

提前致谢,我对每一个回复感到高兴。

XAML:

 <Window x:Class="TestOxyPlot.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:oxy="http://oxyplot.org/wpf"
            xmlns:local="clr-namespace:TestOxyPlot"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <oxy:Plot x:Name="oxyPlot" Title="{Binding Title}" Margin="207,53,0,0">
                <oxy:Plot.Series>
                    <oxy:LineSeries ItemsSource="{Binding Points}"/>
                </oxy:Plot.Series>
            </oxy:Plot>
            <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="44,64,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" MouseLeave="textBox_MouseLeave" TextChanged="textBox_TextChanged"/>
            <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="23" Margin="44,101,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="textBox1_TextChanged"/>
            <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="68,174,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
        </Grid>
    </Window>
  using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using OxyPlot;

    namespace TestOxyPlot
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.Title = "Example 2";
                this.Points = new List<DataPoint>
                    {
                                      new DataPoint(0, 4),
                                      new DataPoint(10, 13),
                                      new DataPoint(20, 15),
                                      new DataPoint(30, 16),
                                      new DataPoint(40, 12),
                                      new DataPoint(50, 12)
                                  };


            }
            public string Title { get; private set; }

            public IList<DataPoint> Points { get; private set; }

            private void textBox_MouseLeave(object sender, MouseEventArgs e)
            {


           }

            private void textBox_TextChanged(object sender, TextChangedEventArgs e)
            {
                try
                {
                    oxyPlot.Width = Int32.Parse(textBox.Text);
                }
                catch (Exception error)
                {
                    MessageBox.Show("Message: " + error);
                }

            }

            private void button_Click(object sender, RoutedEventArgs e)
            {

            }

            private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
            {
                try
                {
                    oxyPlot.Width = Int32.Parse(textBox.Text);
                }
                catch (Exception error)
                {
                    MessageBox.Show("Message: " + error);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

添加此代码

 DataContext = this;

这一行之后

 InitializeComponent();

它将显示图表。此外,为了删除该行并只绘制标记,请使用类似LineSeries

的内容
<oxy:LineSeries ItemsSource="{Binding Points}" LineStyle="None"  MarkerType="Circle" MarkerSize="5" MarkerFill="Black"/>

修改

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        double randomNumX;
        double randomNumY;
        int h = DateTime.Now.Hour;
        int m = DateTime.Now.Minute;
        int s = DateTime.Now.Second;
        String u = h.ToString() + m.ToString() + s.ToString();
        int iu = Int32.Parse(u);
        Random zufall = new Random(iu);

        Points = new List<DataPoint>();
        for (int i = 0; i < 10; i++)
        {
            randomNumX = zufall.NextDouble() * (10 - -10) + -10;
            randomNumY = zufall.NextDouble() * (10 - -10) + -10;
            Points.Add(new DataPoint(randomNumX, randomNumY));
        }
        ls.ItemsSource = Points;
    }

<DockPanel>
    <Button DockPanel.Dock="Top" Click="Button_Click" Content="Click Me"/>
    <oxy:Plot x:Name="oxyPlot" Title="{Binding Title}">
        <oxy:Plot.Axes>
            <oxy:LinearAxis Position="Bottom" />
            <oxy:LinearAxis Position="Right" MinimumPadding="0.1" MaximumPadding="0.1"/>
        </oxy:Plot.Axes>
        <oxy:Plot.Series>
            <oxy:LineSeries x:Name="ls" ItemsSource="{Binding Points}" LineStyle="None"  MarkerType="Circle" MarkerSize="5" MarkerFill="Black"/>
        </oxy:Plot.Series>
    </oxy:Plot> 
</DockPanel>

顺便说一句,出于某种原因,使用ObservationCollection或InvalidatePlot(true)无法正常工作