绘制图形 - 仅显示单个点

Draw graphs - show only single points

(C#申请WPF)

我有一个问题,我必须 "draw" 一个坐标系并只输入图中所示的坐标(没有线条)。

我想用一个库,因为我还要画一个框架,我想用一个库会很容易。 所以我发现了 GnuPlot、Oxyplot 并自己画画。不幸的是,GnuPlot 很愚蠢,因为它没有用于 C# 应用程序的库。 (或者如果你有,请告诉我)。因此,我使用了 OxyPlot,但不幸的是,OxyPlot 只显示坐标系。 现在回答我的问题。 用坐标画坐标系有什么更好的办法吗? 它应该满足以下要求:

如上所述,我已经将它与 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);
                }
            }
        }
    }

添加此代码

 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) 无效