OxyPlot在WinForms中柱状图的应用指南

开发 前端
OxyPlot提供了丰富的功能来创建和自定义柱状图。通过本指南中的例子,您应该能够在WinForms应用程序中创建各种类型的柱状图,并根据需要自定义它们的外观和行为。记住,OxyPlot的功能远不止于此,您可以进一步探索其他图表类型和高级功能。

OxyPlot是一个强大的跨平台绘图库,可以在WinForms应用程序中创建高质量的图表。本指南将重点介绍如何使用OxyPlot在WinForms中创建各种类型的柱状图。

环境设置

首先,您需要在您的WinForms项目中安装OxyPlot。您可以通过NuGet包管理器安装以下包:

  • OxyPlot.Core
  • OxyPlot.WindowsForms

图片图片

在Visual Studio中,右键点击您的项目,选择"管理NuGet包",然后搜索并安装这两个包。

安装完成后,在您的代码中添加以下using语句:

using OxyPlot;
using OxyPlot.Series;
using OxyPlot.WindowsForms;

基础柱状图

让我们从一个简单的柱状图开始。

  1. 在代码中,创建一个PlotModel和BarSeries,然后将数据添加到系列中。
using System;
using System.Windows.Forms;
using OxyPlot;
using OxyPlot.Series; // 确保包含这个命名空间  
using OxyPlot.WindowsForms; // 如果使用 Windows Forms  

namespace AppOxyPlot
{
    public partial class Form1 : Form
    {
        private PlotView plotView1; // 声明 PlotView  

        public Form1()
        {
            InitializeComponent();

            // 初始化 PlotView  
            plotView1 = new PlotView();
            plotView1.Dock = DockStyle.Fill;
            this.Controls.Add(plotView1);

            CreateBasicBarChart();
        }

        private void CreateBasicBarChart()
        {
            var model = new PlotModel { Title = "基础柱状图" };
            var series = new BarSeries();

            series.Items.Add(new BarItem(5));
            series.Items.Add(new BarItem(3));
            series.Items.Add(new BarItem(7));
            series.Items.Add(new BarItem(2));
            series.Items.Add(new BarItem(9));

            model.Series.Add(series);
            plotView1.Model = model;
        }
    }
}

图片图片

这将创建一个简单的柱状图,包含5个数据点。

多系列柱状图

要创建包含多个系列的柱状图,只需添加多个BarSeries到模型中。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OxyPlot.WindowsForms;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Legends;
using OxyPlot.Series;

namespace AppOxyPlot
{
    public partial class Form2 : Form
    {
        private PlotModel plotModel;
        public Form2()
        {
            InitializeComponent();
            InitializePlotView();
        }

        private void InitializePlotView()
        {
            // 创建PlotModel  
            plotModel = new PlotModel
            {
                Title = "季度产品销售对比",
                TitleFontSize = 16,
                TitleColor = OxyColors.Black
            };

            plotModel.Legends.Add(new Legend
            {
                LegendPosition = LegendPosition.RightMiddle,
                LegendPlacement = LegendPlacement.Outside,
                LegendOrientation = LegendOrientation.Vertical
            });

            // 创建多个柱状图系列  
            var electronicsSeries = CreateBarSeries("电子产品", OxyColors.Blue);
            var clothingSeries = CreateBarSeries("服装", OxyColors.Green);
            var foodSeries = CreateBarSeries("食品", OxyColors.Red);

            // 添加数据  
            AddSeriesData(electronicsSeries, new double[] { 120.5, 150.3, 200.7, 180.2 });
            AddSeriesData(clothingSeries, new double[] { 85.3, 95.6, 110.4, 130.1 });
            AddSeriesData(foodSeries, new double[] { 65.7, 78.2, 90.5, 105.3 });

            // 创建类别轴(垂直轴)  
            var categoryAxis = new CategoryAxis
            {
                Position = AxisPosition.Left,
                Key = "CategoryAxis",
                Title = "产品类别",
                TitleFontSize = 12,
                TitleColor = OxyColors.Black
            };
            categoryAxis.Labels.AddRange(new[] { "Q1", "Q2", "Q3", "Q4" });

            // 创建数值轴(水平轴)  
            var valueAxis = new LinearAxis
            {
                Position = AxisPosition.Bottom,
                Title = "销售额 (万元)",
                TitleFontSize = 12,
                TitleColor = OxyColors.Black,
                MinimumPadding = 0,
                MaximumPadding = 0.1,
                MajorGridlineStyle = LineStyle.Solid,
                MinorGridlineStyle = LineStyle.Dot,
                MajorGridlineColor = OxyColors.LightGray,
                MinorGridlineColor = OxyColors.LightGray
            };

            // 将轴和序列添加到PlotModel  
            plotModel.Axes.Add(categoryAxis);
            plotModel.Axes.Add(valueAxis);
            plotModel.Series.Add(electronicsSeries);
            plotModel.Series.Add(clothingSeries);
            plotModel.Series.Add(foodSeries);

            // 设置PlotView的模型  
            plotView1.Model = plotModel;
        }

        // 创建柱状图系列的辅助方法  
        private BarSeries CreateBarSeries(string title, OxyColor color)
        {
            return new BarSeries
            {
                Title = title,
                StrokeColor = OxyColors.Black,
                StrokeThickness = 1,
                FillColor = color,
                BarWidth = 0.8 // 可以调整柱子宽度  
            };
        }

        // 添加数据的辅助方法  
        private void AddSeriesData(BarSeries series, double[] values)
        {
            for (int i = 0; i < values.Length; i++)
            {
                series.Items.Add(new BarItem(values[i]) { CategoryIndex = i });
            }
        }

        // 动态更新数据的方法  
        private void UpdateChartData()
        {
            // 清除现有数据  
            foreach (var series in plotModel.Series)
            {
                if (series is BarSeries barSeries)
                {
                    barSeries.Items.Clear();
                }
            }

            // 添加新数据  
            var electronicsSeries = plotModel.Series[0] as BarSeries;
            var clothingSeries = plotModel.Series[1] as BarSeries;
            var foodSeries = plotModel.Series[2] as BarSeries;

            if (electronicsSeries != null && clothingSeries != null && foodSeries != null)
            {
                AddSeriesData(electronicsSeries, new double[] { 140.5, 170.3, 220.7, 200.2 });
                AddSeriesData(clothingSeries, new double[] { 95.3, 105.6, 120.4, 140.1 });
                AddSeriesData(foodSeries, new double[] { 75.7, 88.2, 100.5, 115.3 });

                // 通知模型更新  
                plotModel.InvalidatePlot(true);
            }
        }

        // 添加按钮来触发数据更新(可选)  
        private void btnUpdateData_Click(object sender, EventArgs e)
        {
            UpdateChartData();
        }
    }
}

图片图片

堆叠柱状图

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Legends;
using OxyPlot.Series;
using OxyPlot.WindowsForms;

namespace AppOxyPlot
{
    public partial class Form3 : Form
    {
        private PlotModel plotModel;
        public Form3()
        {
            InitializeComponent();
            CreateBarChart();
        }

        private void CreateBarChart()
        {
            // 创建PlotModel  
            plotModel = new PlotModel
            {
                Title = "销售数据分析",
                TitleFontSize = 16,
                TitleColor = OxyColors.Black
            };

            // 创建柱状图序列  
            var series1 = new LinearBarSeries
            {
                Title = "电子产品",
                FillColor = OxyColors.Blue,
                StrokeColor = OxyColors.Black,
                StrokeThickness = 1
            };

            var series2 = new LinearBarSeries
            {
                Title = "软件服务",
                FillColor = OxyColors.Green,
                StrokeColor = OxyColors.Black,
                StrokeThickness = 1
            };

            // 添加数据点  
            series1.Points.Add(new DataPoint(0, 120.5));
            series1.Points.Add(new DataPoint(1, 150.3));
            series1.Points.Add(new DataPoint(2, 200.7));
            series1.Points.Add(new DataPoint(3, 180.2));

            series2.Points.Add(new DataPoint(0, 85.3));
            series2.Points.Add(new DataPoint(1, 95.6));
            series2.Points.Add(new DataPoint(2, 110.4));
            series2.Points.Add(new DataPoint(3, 130.1));

            // 创建类别轴  
            var xAxis = new CategoryAxis
            {
                Position = AxisPosition.Bottom,
                Title = "城市",
                Key = "CityAxis"
            };
            xAxis.Labels.Add("北京");
            xAxis.Labels.Add("上海");
            xAxis.Labels.Add("广州");
            xAxis.Labels.Add("深圳");

            // 创建数值轴  
            var yAxis = new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "销售额 (万元)",
                Minimum = 0
            };

            // 添加轴和序列到模型  
            plotModel.Axes.Add(xAxis);
            plotModel.Axes.Add(yAxis);
            plotModel.Series.Add(series1);
            plotModel.Series.Add(series2);

            plotView1.Model = plotModel;
        }
    }
}

图片图片

结论

OxyPlot提供了丰富的功能来创建和自定义柱状图。通过本指南中的例子,您应该能够在WinForms应用程序中创建各种类型的柱状图,并根据需要自定义它们的外观和行为。记住,OxyPlot的功能远不止于此,您可以进一步探索其他图表类型和高级功能。

责任编辑:武晓燕 来源: 技术老小子
相关推荐

2011-12-21 12:58:41

JavaJFreeChart

2023-05-11 08:00:00

JavaScript柱状图

2021-02-24 11:23:22

Pyecharts可视化工具柱状图

2024-12-30 07:40:00

WinFormsADO.NET数据库

2021-01-06 10:05:09

鸿蒙HarmonyOSCanvas

2024-05-15 07:48:08

.NET开源图表库

2021-01-21 09:10:29

ECharts柱状图大数据

2022-06-14 15:13:22

Echarts柱状图

2022-05-23 10:53:54

canvas柱状图鸿蒙

2021-07-01 09:24:35

PythonTable数据表

2020-04-25 20:11:23

Python热力图代码

2010-08-09 10:21:56

XMLFlex

2024-10-12 09:31:04

WinForms应用程序线程

2024-06-19 09:28:43

2022-02-23 15:17:04

鸿蒙OpenHarmonJacascript

2021-03-05 07:03:38

Pyecharts可视化工具复合图

2009-08-10 13:05:06

C# DLLC# Delphi开发

2010-06-28 18:21:36

UML类图设计

2024-11-19 15:43:22

2019-05-09 11:08:13

混合云公共云云计算
点赞
收藏

51CTO技术栈公众号