以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  复杂图表如何呈现,请专家指点  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=148333)

--  作者:xiangyushi
--  发布时间:2020/4/5 18:14:00
--  复杂图表如何呈现,请专家指点
工作需要,将每项产品的每月上、中、下旬的计划数情况和完成数情况在一个图表中进行对比呈现,
如图(注:下图是在Excel中用两图表,然后剪切拼接而成)
如何实现,请专家高人指点,谢谢!

此主题相关图片如下:微信图片_复杂图表.png
按此在新窗口浏览图片
数据表如下(可直接复制粘贴到Excel中)
产品号 计划上旬 计划中旬 计划下旬 完成上旬 完成中旬 完成下旬
PD01 10 20 50 90 60 33
PD02 20 30 60 50 20 20
PD03 30 60 20 70 40 40
[此贴子已经被作者于2020/4/5 18:16:59编辑过]

--  作者:sloyy
--  发布时间:2020/4/5 21:04:00
--  
非常简单: 
1 设置2个图系,代表计划数和完成数, 产品 PD01,PD02,PD03 图形设置为柱状图;
2 2个图系的 Stacked 都设置为true 叠加
 
[此贴子已经被作者于2020/4/5 21:05:29编辑过]

--  作者:有点蓝
--  发布时间:2020/4/6 9:51:00
--  
只能做到前后重叠的效果,无法并排显示

Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
Chart.VisualEffect = True \'加上这一行,让你的图表更漂亮
Chart.ChartType = ChartTypeEnum.Bar \'图表类型该为Bar(条形)
Chart.DataSource = "Sheet2" \'设置绑定表
Chart.SeriesList.Clear() \'清除图表原来的图系
Chart.SeriesList2.Clear()

Series = Chart.SeriesList.Add() \'增加第一个图系
Series.Text = "计划上旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "计划上旬" \'Y轴绑定到数量列
Series = Chart.SeriesList.Add() \'增加第二个图系
Series.Text = "计划中旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "计划中旬" \'Y轴绑定到数量列
Series = Chart.SeriesList.Add() \'增加第二个图系
Series.Text = "计划下旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "计划下旬" \'Y轴绑定到数量列
Chart.AxisY.text = "计划"

Chart.ChartType2 = ChartTypeEnum.Bar

Series = Chart.SeriesList2.Add() \'增加第一个图系
Series.Text = "完成上旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "完成上旬" \'Y轴绑定到数量列
Series = Chart.SeriesList2.Add() \'增加第二个图系
Series.Text = "完成中旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "完成中旬" \'Y轴绑定到数量列
Series = Chart.SeriesList2.Add() \'增加第二个图系
Series.Text = "完成下旬"
Series.X.DataField = "产品号" \'X轴绑定到产品列
Series.Y.DataField = "完成下旬" \'Y轴绑定到数量列
Chart.AxisY2.text = "完成"

Chart.AxisY.Min = 0 \'指定Y轴的最小值
Chart.AxisY.Max =200 \'指定Y轴的最大值
Chart.AxisY2.Min = 0 \'指定Y轴的最小值
Chart.AxisY2.Max =200 \'指定Y轴的最大值
Chart.BarClusterWidth = 80
Chart.BarClusterWidth = 20
Chart.LegendVisible = True \'显示图列
Chart.Stacked = True
Chart.Stacked2 = True
Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端)

--  作者:xiangyushi
--  发布时间:2020/4/7 9:38:00
--  
谢谢有点蓝!
前后重叠的效果看起来不够美观。
希望能在后续的版本更新中实现这个功能。

--  作者:shenyl0211
--  发布时间:2020/4/7 12:51:00
--  
你的问题很有意思,也很现实。
你想要的来了(但你自己的图和数据对不上):
列的顺序应改为:产品号、计划上旬、完成上旬、计划中旬、完成中旬、计划下旬、完成下旬。这样修改之后,即使没有图,也方便对比。
Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Dim t As Table = Tables("表A") \'定义一个变量t引用数据表
Dim r,ymax,y As Integer
Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
Chart.ChartType = ChartTypeEnum.Bar \'图表类型改为Bar(条形)
Chart.SeriesList.Clear() \'清除图表原来的图系
For Each c As Col In t.Cols
    If c.Name <> "产品号" Then
        y = 0
        Series = Chart.SeriesList.Add() \'增加一个图系
        Series.Text = c.Name \'设置图系的标题
        Series.Length = t.Rows.Count \'设置图系的长度
        For r = 0 To t.Rows.Count - 1
            y = y + t.Rows(r)(c.Name)
            If c.name.StartsWith("计划") Then
                Series.X(r) = 2*r
            Else
                Series.X(r) = 2*r + 0.5
            End If
            Series.Y(r) = t.Rows(r)(c.Name)
            Chart.AxisX.SetValueLabel(2*r + 0.25, t.Rows(r)("产品号")) \'指定字符表示
        Next
        If y > ymax Then
            ymax = y
        End If
    End If
Next
chart.AxisY.Max = ymax
Chart.AxisX.AnnoWithLabels = True \'启用字符标示
\'Chart.VisualEffect = True \'加上这一行,让你的图表更漂亮 --实际更不好看
Chart.LegendVisible = True \'显示图列
Chart.LegendCompass = CompassEnum.South \'图列显示在南方(底端)
Chart.Stacked = True
[此贴子已经被作者于2020/4/7 13:00:40编辑过]

--  作者:有点蓝
--  发布时间:2020/4/7 13:50:00
--  
图片点击可在新窗口打开查看图片点击可在新窗口打开查看