找回密码
 立即注册

QQ登录

只需一步,快速开始

xcy3280019

银牌会员

2

主题

9

帖子

2428

积分

银牌会员

积分
2428

活字格认证

最新发帖
xcy3280019
银牌会员   /  发表于:2013-12-25 21:41  /   查看:12290  /  回复:12
使用的是C1 FOR WPF

我想让chart的X坐标显示时间,但是有几个问题。第一,缩放到一定程度后会出现重复显示。



第二,时间最小值无法显示到秒,现在只能显示到12:30:10然后就是12:30:15,以5秒为间隔显示,无法满足需求
第三,X轴数据每个之间空的距离太大
第四,如上图,我照着sample里面做了一个游标,请问游标中如何显示时间,现在只可以显示动态的double数据。
第五,请问可否为单独的一个点添加symbols,我看到现在的symbols是直接添加在dataseries上面的,要么全有要么全没有,请问如何设置。
第六,如果charttype使用linesymbols的话,数据超过3000条就会非常卡,严重影响使用。
第七,请问,以时间为X轴的livedata是否可以实现,并同时实现缩放功能

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

12 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-12-26 13:28:00
沙发
回复 1楼xcy3280019的帖子

第一,很抱歉,我无法重现第一个问题能否把你的测试demo发到论坛调试?
第二,时间最小值无法显示到秒,现在只能显示到12:30:10然后就是12:30:15,以5秒为间隔显示,无法满足需求
》》可以通过this.c1chart1.View.AxisX.MinorUnit 和 this.c1chart1.View.AxisX.MajorUnit 来设置显示单位。
第三,X轴数据每个之间空的距离太大
》》请尝试第二个问题是否能解决这个问题。
第四,如上图,我照着sample里面做了一个游标,请问游标中如何显示时间,现在只可以显示动态的double数据。
》》请问游标指的是什么?C:\Users\icemanwang\Documents\ComponentOne Samples\Studio for WPF\C1.WPF.Chart\CS\ChartSamples\Interaction\ZoomChartControl.xaml 是指的例子中的功能吗?
第五,请问可否为单独的一个点添加symbols,我看到现在的symbols是直接添加在dataseries上面的,要么全有要么全没有,请问如何设置。
》》请问 symbols 具体指什么功能?
第六,如果charttype使用linesymbols的话,数据超过3000条就会非常卡,严重影响使用。
》》如果确实需要,建议进行分批显示。可以通过 x 轴滚动事件分批加载数据。
第七,请问,以时间为X轴的livedata是否可以实现,并同时实现缩放功能
》》livedata 可以参考:C:\Users\icemanwang\Documents\ComponentOne Samples\Studio for WPF\C1.WPF.Chart\CS\ChartSamples\Performance\Dynamic_Net4.xaml
回复 使用道具 举报
xcy3280019
银牌会员   /  发表于:2013-12-26 13:59:00
板凳
回复 2楼iceman的帖子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 System.Collections;
using C1.WPF.C1Chart;

namespace ComponentOneTest
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            c1Chart1.BeginUpdate();
            int count = 3000;
            DateTime[] x = new DateTime[count];
            double[] y = new double[count];
            for (int i = 0; i < count; i++)
            {
                x = DateTime.Now.AddMinutes(i);
                y = i;
            }
            //X轴设为时间
            c1Chart1.View.AxisX.IsTime = true;
            c1Chart1.View.AxisX.MinorGridStroke = Brushes.Red;
            c1Chart1.View.AxisX.MinorGridStrokeDashes = new DoubleCollection(3);
            c1Chart1.View.AxisX.Scale = 1000;
           // c1Chart1.View.AxisX.MajorUnit = .1;
            c1Chart1.View.AxisX.MinorUnit = .01;
            c1Chart1.View.AxisX.AnnoFormat = "MM-dd HH:MM:ss";
            //添加数据
            XYDataSeries ds = new XYDataSeries()
            {
                XValuesSource = x,
                ValuesSource = y,
                ConnectionStrokeThickness = 3,
                Label = "hhh",
                PointTooltipTemplate = (DataTemplate)Resources["lbl"],
            };
            c1Chart1.Data.Children.Add(ds);
            c1Chart1.View.AxisX.ScrollBar = new AxisScrollBar();
            c1Chart1.View.AxisY.ScrollBar = new AxisScrollBar();
            c1Chart1.View.AxisY.MinScale = 0.01;
            c1Chart1.View.AxisX.MinScale = 0.01;

            //Marker
            var pnl = new ChartPanel();
            var obj = new ChartPanelObject()
            {
                HorizontalAlignment = HorizontalAlignment.Right,
                VerticalAlignment = VerticalAlignment.Bottom,
               
            };
            var bdr = new Border()
            {
                Background = new SolidColorBrush(Colors.Green) { Opacity = 0.4 },
                BorderBrush = new SolidColorBrush(Colors.Green),
                BorderThickness = new Thickness(1, 1, 3, 3),
                CornerRadius = new CornerRadius(6, 6, 0, 6),
                Padding = new Thickness(3)
            };
            var sp = new StackPanel();
            var tb1 = new TextBlock();
            var bind1 = new Binding();
            bind1.Source = ds;
            bind1.Path = new PropertyPath("XValuesSource");
            tb1.SetBinding(TextBlock.TextProperty, bind1);

            var tb2 = new TextBlock();
            var bind2 = new Binding();
            bind2.Source = obj;
            bind2.StringFormat = "数据值={0:#.##}";
            bind2.Path = new PropertyPath("DataPoint.Y");
            tb2.SetBinding(TextBlock.TextProperty, bind2);

            sp.Children.Add(tb1);
            sp.Children.Add(tb2);

            bdr.Child = sp;

            obj.Content = bdr;
            obj.DataPoint = new Point();
            obj.Action = ChartPanelAction.MouseMove;

            pnl.Children.Add(obj);

            c1Chart1.View.Layers.Add(pnl);
            //曲线类型
            c1Chart1.ChartType = ChartType.Line;
            c1Chart1.EndUpdate();
           // c1Chart1.Actions.Add(new ZoomAction());
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            c1Chart1.View.AxisX.Scale = 1;
            c1Chart1.View.AxisX.Value = 0.5;
            c1Chart1.View.AxisY.Scale = 1;
            c1Chart1.View.AxisY.Value = 0.5;
            foreach (DataSeries ds in c1Chart1.Data.Children)
            {
                ds.PointLabelTemplate = null;
            }
        }

        private void c1Chart1_MouseWheel(object sender, MouseWheelEventArgs e)
        {

        }

    }
}
回复 使用道具 举报
xcy3280019
银牌会员   /  发表于:2013-12-26 14:00:00
地板
回复 2楼iceman的帖子

<Window.Resources>
        <c1ataPointConverter x:Key="fc"/>
        <DataTemplate x:Key="lbl">
            <TextBlock x:Name="tb" FontSize="22" Margin="2" Foreground="DarkRed" Text="{Binding Converter={StaticResource fc}, ConverterParameter=数值:\{#Value\}}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <c1:C1Chart MouseWheel="c1Chart1_MouseWheel"  Palette="Flow" Name="c1Chart1">
            <c1:C1ChartLegend/>
            <c1:C1Chart.Actions>
                <c1:ZoomAction Fill="#50ffffff" Stroke="Red"/>
                <c1:TranslateAction Modifiers="Shift" />
                <c1:ScaleAction Modifiers="Control" />
            </c1:C1Chart.Actions>
        </c1:C1Chart>
        <Button Content="Button" Click="button1_Click" Height="23" HorizontalAlignment="Left" Margin="700,0,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
    </Grid>
回复 使用道具 举报
xcy3280019
银牌会员   /  发表于:2013-12-26 14:11:00
5#
上面两个是我的代码,放大几次之后就会产生如上图的问题。
游标就是图上绿色的那个,代码详见cs中//MARKER之后的代码段。使用的例子是MouseMarker那个
this.c1chart1.View.AxisX.MinorUnit 和 this.c1chart1.View.AxisX.MajorUnit,这两个数据是double类型的,请问如何设置。
XYDataSeries有一个symbolmarker的属性,我说的就是这个,结果是在图上每一个数据点有一个圆标记。

如果还是无法重现的话,请告诉我如何设置才可以使X轴可以完美的显示时间,另外游标可以显示时间,每个数据点可以单独标记即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-26 17:51:00
6#
回复 4楼xcy3280019的帖子

重复显示问题,请你通过以下代码测试:

  1. public MainWindow()
  2.         {
  3.             InitializeComponent();
  4.             //c1Chart1.BeginUpdate();
  5.             int count = 30;
  6.             DateTime[] x = new DateTime[count];
  7.             double[] y = new double[count];
  8.             for (int i = 0; i &lt; count; i++)
  9.             {
  10.                 x[i] = DateTime.Now.AddSeconds(i);
  11.                 y[i] = i;
  12.             }
  13.             //X轴设为时间
  14.             c1Chart1.View.AxisX.IsTime = true;
  15.             c1Chart1.View.AxisX.MinorGridStroke = Brushes.Red;
  16.             c1Chart1.View.AxisX.MinorGridStrokeDashes = new DoubleCollection(3);
  17.             c1Chart1.View.AxisX.AnnoFormat = &quot;MM-dd HH:mm:ss&quot;;
  18.             //添加数据
  19.             XYDataSeries ds = new XYDataSeries()
  20.             {
  21.                 XValuesSource = x,
  22.                 ValuesSource = y,
  23.                 ConnectionStrokeThickness = 3,
  24.                 Label = &quot;hhh&quot;,
  25.                // PointTooltipTemplate = (DataTemplate)Resources[&quot;lbl&quot;],
  26.             };
  27.             c1Chart1.Data.Children.Add(ds);
  28.             c1Chart1.View.AxisX.ScrollBar = new AxisScrollBar();
  29.             c1Chart1.View.AxisY.ScrollBar = new AxisScrollBar();
  30.             c1Chart1.View.AxisY.MinScale = 1;
  31.             c1Chart1.View.AxisX.MinScale = 1;
  32.             c1Chart1.View.AxisX.MajorUnit = 1.157407407407407e-5;
  33.             //c1Chart1.View.AxisX.MinorUnit = 1.157407407407407e-5;

  34.             //Marker
  35.             var pnl = new ChartPanel();
  36.             var obj = new ChartPanelObject()
  37.             {
  38.                 HorizontalAlignment = HorizontalAlignment.Right,
  39.                 VerticalAlignment = VerticalAlignment.Bottom,

  40.             };
  41.             var bdr = new Border()
  42.             {
  43.                 Background = new SolidColorBrush(Colors.Green) { Opacity = 0.4 },
  44.                 BorderBrush = new SolidColorBrush(Colors.Green),
  45.                 BorderThickness = new Thickness(1, 1, 3, 3),
  46.                 CornerRadius = new CornerRadius(6, 6, 0, 6),
  47.                 Padding = new Thickness(3)
  48.             };
  49.             var sp = new StackPanel();
  50.             var tb1 = new TextBlock();
  51.             var bind1 = new Binding();
  52.             bind1.Source = ds;
  53.             bind1.Path = new PropertyPath(&quot;XValuesSource&quot;);
  54.             tb1.SetBinding(TextBlock.TextProperty, bind1);

  55.             var tb2 = new TextBlock();
  56.             var bind2 = new Binding();
  57.             bind2.Source = obj;
  58.             bind2.StringFormat = &quot;数据值={0.##}&quot;;
  59.             bind2.Path = new PropertyPath(&quot;DataPoint.Y&quot;);
  60.             tb2.SetBinding(TextBlock.TextProperty, bind2);

  61.             sp.Children.Add(tb1);
  62.             sp.Children.Add(tb2);

  63.             bdr.Child = sp;

  64.             obj.Content = bdr;
  65.             obj.DataPoint = new Point();
  66.             obj.Action = ChartPanelAction.MouseMove;

  67.             pnl.Children.Add(obj);

  68.             c1Chart1.View.Layers.Add(pnl);
  69.             //曲线类型
  70.             c1Chart1.ChartType = ChartType.Line;
  71.             //c1Chart1.EndUpdate();
  72.             // c1Chart1.Actions.Add(new ZoomAction());
  73.         }
复制代码
回复 使用道具 举报
xcy3280019
银牌会员   /  发表于:2013-12-27 08:59:00
7#
回复 6楼iceman的帖子

谢谢,请问游标如何显示时间值。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-27 18:45:00
8#
回复 7楼xcy3280019的帖子

问题正在处理中,周一回复。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-30 12:15:00
9#
回复 7楼xcy3280019的帖子

关于 Binding StringFormat 字符格式化上请参考,看是否能解决你的问题:http://www.cnblogs.com/zhengwen/archive/2010/06/19/1761036.html
回复 使用道具 举报
xcy3280019
银牌会员   /  发表于:2013-12-30 13:35:00
10#
回复 9楼iceman的帖子



不是stringformat的问题,绑定到的数据是一个double数据,无法转成时间,我绑定到X轴上的数据是DATETIME类型,我如何才能获取到我绑定的数据,代码也在图里面

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部