7.单折线图(SingleLineChart)

愿你出走半生,归来仍是少年! 

环境:.NET 7、MAUI 

        数据的统计呈现主要以图表形式为主,而折线图是统计图中最常用的形式之一。

        LiveChartsCore.SkiaSharpView是一个简单、灵活、交互式、强大的跨平台图表库,支持Maui、Uno Platform、Blazor-wasm、WPF、WinForms、Xamarin、Avalonia、WinUI、UWP。

        在MAUI框架下可安装LiveChartsCore.SkiaSharpView.Maui包进行使用,基于其CartesianChart类进行封装,实现单柱的柱状图展示。

1.BasicSerieDto

        看过LiveChartsCore.SkiaSharpView的文档后会了解,它并未直接的给出类似LineChart、PieChart之类的图标,而是有一个很基础的CartesianChart(笛卡尔坐标图表),然后塞入不同的Series实现图表类别的区分以及数据填充。为了更加方便的在业务中使用图表,所以需要进行BasicSerieDto的封装。

1.1.基础属性

        一个BasicSerieDto代表一个类别,它包含了类别名称、数据集合、标签集合。通过这些数据可以很方便的转换出对应图表的数据。

 public class BasicSerieDto
 {
     /// <summary>
     /// 类别名称
     /// </summary>
     public string Name { get; set; }

     /// <summary>
     /// 数据
     /// </summary>
     public List<double> Datas { get; set; }

     /// <summary>
     /// 文本标签
     /// </summary>
     public List<string> Labels { get; set; }

     public BasicSerieDto(string name, List<double> datas, List<string> labels)
     {
         Name = name;

         if (datas == null || datas.Count==0)
         {
             throw new ArgumentNullException("BasicSerieDto datas");
         }

         Datas = datas;


         if (labels == null || labels.Count != datas.Count)
         {
             throw new  Exception("BasicSerieDto labels 为空或数量与数据不匹配");
         }
         Labels = labels;
     }
}

1.2.转换出单柱图标的LineSeries

        柱状图使用的是LineSeries对象,主要设定了类别名称、数据值、标签、标注等。

        其中比较重要的是针对文本的字体需要设定下支持中文的,不然有些品牌的系统会出现乱码情况

  /// <summary>
  /// 转换为单折线 
  /// </summary>
  /// <returns></returns>
  public LineSeries<double> ToSingleLine()
  {
      var series = new LineSeries<double>()
      {
          Name = Name,

          Values = Datas,

          //填充色
          Fill = new SolidColorPaint(SKColors.Blue.WithAlpha(90)),

          //点上的文本
          DataLabelsFormatter = (point) => { return Labels[point.Index]; },
          DataLabelsPosition = LiveChartsCore.Measure.DataLabelsPosition.Top,
          DataLabelsSize = 12,
          DataLabelsPaint = new SolidColorPaint(SKColors.Black)
          {
              SKTypeface = SKFontManager.Default.MatchCharacter('汉')
          },

          
          IsHoverable = false
      };

      return series;
  }

2.图表标题

        比较重要的也是汉化问题。

 private void InitTitle(string title)
 {
     Title = new LabelVisual()
     {
         Text = title,
         TextSize = 25,
         Padding = new LiveChartsCore.Drawing.Padding(15),
         Paint = new SolidColorPaint(SKColors.DarkSlateGray)
         {
             SKTypeface = SKFontManager.Default.MatchCharacter('汉')
         },

     };


     chart.SetBinding(CartesianChart.TitleProperty, new Binding("Title"));
 }

3.横坐标

        比较重要的也是汉化问题。

  /// <summary>
  /// 初始化横坐标
  /// </summary>
  /// <param name="xLabels"></param>
  private void InitX(List<string> xLabels)
  {
      var xAxis = new Axis()
      { 
          Labels = xLabels,
          LabelsAlignment = LiveChartsCore.Drawing.Align.Start,
          //LabelsRotation = 90,//横坐标文本旋转角度
          LabelsPaint = new SolidColorPaint(SKColors.Black)
          {
              SKTypeface = SKFontManager.Default.MatchCharacter('汉')
          },

      };

      XAxes = new Axis[] { xAxis };

      chart.SetBinding(CartesianChart.XAxesProperty, new Binding("XAxes"));
  }

4.数据设置

        通过BasicSerieDto的ToSingleLine方法直接获取LineSeries<double>。

private void InitValue(BasicSerieDto dto)
{
    
    Series = new ISeries[]{  dto.ToSingleLine() };

    chart.SetBinding(CartesianChart.SeriesProperty, new Binding("Series"));
}

5.使用 

public partial class SingleBarChartDemo : ContentPage
{
    private class Day
    {
        public string name { get; set; }

        public double Money { get; set; }
    }

    public SingleBarChartDemo()
    {
        InitializeComponent();

        List<Day> days = new List<Day>();

        for (int i = 0; i < 7; i++)
        {
            days.Add(new Day()
            {
                name = "周" + i,
                Money = (new Random()).NextDouble() * 10000
            });

        }

        chart.BindData("一周营业额", days.Select(p => p.name).ToList(),
            new BasicSerieDto("",
            days.Select(p => p.Money).ToList(),
             days.Select(p => p.name + "\n" + Math.Round(p.Money, 2)).ToList()) 
            );

    }
}

6.效果

单折线图效果
  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用Three.js绘制折线图需要用到以下步骤: 1. 创建场景:使用`THREE.Scene()`创建一个3D场景对象。 2. 创建相机:使用`THREE.PerspectiveCamera()`创建一个透视相机,用于捕捉场景中的物体。 3. 创建渲染器:使用`THREE.WebGLRenderer()`创建一个WebGL渲染器,用于将场景渲染到浏览器中。 4. 创建几何体:使用`THREE.Geometry()`创建一个几何体对象,用于存储折线图的顶点信息。 5. 创建材质:使用`THREE.LineBasicMaterial()`创建一个材质对象,用于设置折线的颜色和宽度。 6. 创建折线:使用`THREE.Line()`将几何体和材质对象组合成一个折线对象。 7. 将折线添加到场景中:使用`scene.add(line)`将折线添加到场景中。 8. 渲染场景:使用`renderer.render(scene, camera)`将场景渲染到浏览器中。 下面是一个简的例子,演示如何使用Three.js绘制一个折线图: ```javascript // 创建场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建几何体 var geometry = new THREE.Geometry(); geometry.vertices.push(new THREE.Vector3(-2, 0, 0)); geometry.vertices.push(new THREE.Vector3(0, 2, 0)); geometry.vertices.push(new THREE.Vector3(2, 0, 0)); // 创建材质 var material = new THREE.LineBasicMaterial({ color: 0x00ff00, linewidth: 2 }); // 创建折线 var line = new THREE.Line(geometry, material); // 将折线添加到场景中 scene.add(line); // 渲染场景 renderer.render(scene, camera); ``` 这个例子创建了一个三角形折线图,其顶点坐标分别为(-2,0,0),(0,2,0)和(2,0,0)。您可以根据需要修改顶点坐标和材质属性,来绘制自己想要的折线图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是那个帕吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值