【问题标题】:How to add a marker at a specific point in a Dynamic Data Display plot?如何在动态数据显示图中的特定点添加标记?
【发布时间】:2016-09-12 07:35:03
【问题描述】:

我正在使用动态数据显示 (v0.4) 绘图,我想在系列的特定数据点添加一个圆形标记,以突出显示绘图最大值的位置。

考虑到动态数据显示开发人员提供的极少量文档和示例,有人知道如何在特定点添加标记吗?

更新

由于 v0.4 没有 d3:CircleMarkerGraph 并且我想使用这个版本而不是 v0.3(还原也需要代码调整),我尝试了以下方法:

查看:

<d3:ChartPlotter x:Name="spectrumPlot" />
    <d3:LineGraph x:Name="spectrumLineGraph" DataSource="{Binding SpectrumPlotData}"/>
    <d3:MarkerPointsGraph x:Name="spectrumMarkers" DataSource="{Binding SpectrumMarkersData}" />
</d3:ChartPlotter>

视图模型:

private IPointDataSource _spectrumMarkersData;
    public IPointDataSource SpectrumMarkersData
    {
        get { return _spectrumMarkersData; }
        set
        {
            _spectrumMarkersData = value;
            OnPropertyChanged("SpectrumMarkersData");
        }
    }

private void UpdatePlotData()
    {
        EnumerableDataSource<double> xDataSource, yDataSource;
        xDataSource = new EnumerableDataSource<double>(SignalProcessor.Instance.GetXAxisSpectrum()); xDataSource.SetXMapping(X => X);
        yDataSource = new EnumerableDataSource<double>(SignalProcessor.Instance.GetYAxisSpectrum()); yDataSource.SetYMapping(Y => Y);
        SpectrumPlotData = new CompositeDataSource(xDataSource, yDataSource);
        SpectrumMarkersData = new CompositeDataSource(xDataSource, yDataSource);
    }

我希望在频谱图中的每个点都有一个标记,但没有出现。 有人知道我做错了什么吗?

【问题讨论】:

    标签: c# wpf xaml dynamic-data-display


    【解决方案1】:

    在 Silverlight 版本的 online tutorial 中,在绘制多个图形部分,他们使用第二个绘图来标记特定项目。也就是说,标记作为第二个图叠加在图表上。

    您可以从 CodePlex 以源代码形式下载 WPF 版本(最新的可下载版本是 v0.3),它不公开与 Silverlight 版本相同的对象或命名空间。

    假设一个简单的数据点列表,其中 X 坐标是数组中项目的索引。标记使用 Point 对象映射和 X 索引到点 Y 值。这样您就不需要为数据集中的每个项目都设置一个标记。您需要自己实现GetDataPoints()GetMarkPoints(),或者使用您已有的任何集合。

    C# 代码隐藏示例:

    public partial class GraphView : UserControl
    {
        public GraphView()
        {
            InitializeComponent();
    
            // Get the data and mark points.
            double dataPoints[] = GetDataPoints();
            Point markPoints[] = GetMarkPoints();
    
            // Plot the data.
            line.Plot(dataPoints);
    
            // Plot the markers.
            markers.Plot(markPoints);
        }
    }
    

    还有(Silverlight)XAML:

    <UserControl x:Class="GraphView"
        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:d3="clr-namespace:Microsoft.Research.DynamicDataDisplay;assembly=DynamicDataDisplay.Silverlight"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
            <d3:Chart>
                <Grid>
                    <!-- Plot line graph -->
                    <d3:LineGraph Name="line" 
                                  Description="Actual data" 
                                  Stroke="Green"/>                
                    <!-- Plot additional points over line graph -->
                    <d3:CircleMarkerGraph Name="markers" 
                                          Description="Interesting points" 
                                          Size="5" Color="Black"/>
                </Grid>
            </d3:Chart>
        </Grid>
    </UserControl>
    

    【讨论】:

    • 感谢您提供此解决方案。但是在恢复到 v0.3 之前,我想进一步尝试 v0.4。请检查我更新的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多