
这里我们都简称玫瑰图
Excel做玫瑰图最难的其实是数据的构建,怎么把需要的数据结构做出来,结构出来了,图表的制作就非常快了
一、按照惯例,我们还是先看看效果

二、详细聊聊数据结构
●数据源

●先来说下用什么图表来做的
其实我们用的雷达图来做圆形的图表
先看下这个数据源做出来的雷达图效果

传统的雷达图是八个顶角变化来表示分数变化
看上去不够炫,为了让整个一扇全部是分数长度,我们这里可以发散下思维

我们原来是8个顶角,我们只要把8个顶角做成360个顶角,每个顶角是一度,八个给平分了

然后会vba的自己vba写个小程序,自己给你做,不会的自己手工做一下

第一列角度,没用的数据,只是为了方便童鞋们理解,我们做了360度的数据

选中数据部分,插入雷达图

得到一个这样的图表,形状已经出来了,我们来做一个加工,删除不要的元素

●然后我们做一个辅助区分范围

做一个辅助数据,做个饼图,来区分范围

看上去很乱,没关系,选择我们的饼图,把填充色取消,设置先边框颜色

基本上一个同色的玫瑰图就做完了
●但是我们第一个演示的是一个不同色的玫瑰图
这个怎么办?
还是从数据结构中解决问题
我们现在数据全部在一行,改数据的结果,我们只要把每45°数据,错开一行,就可以做成不同色的图表

同样重复上面的操作,就能做出下面的效果了

自动多个颜色了
●数据之间做个区分
但是,有的同学说了,这样好麻烦,我们还要做个辅助框线,才能分清,不然都连在一起了,不好看
还是改数据源
我们在每个角度直角插入一个0°就好了


每个都是,然后还是按照上面的方法作图

不需要做大的修改了,还是像上面那样,做个饼图辅助列,可以辅助显示数据

●我还不满足,这是等分的,但是实际上,我想根据数据不同做成不等分的
从数据源来处理,我们现在是把360°等分乐8份,一个份45°

公式:=ROUNDUP(C3/$C$11*360,0)
就是算这个分数占总数的比例,乘以360,然后用了小数全部向上舍入的函数roundup,让最少每一度都有一个数据
然后就和上面一样的做法,54度写一个数据,84度写一个数据,以此类推


这样不等分的去改数据源,按照上面方法作图

三、总结
●做玫瑰图,我们可以用雷达图,用非常多的角度来做雷达图的方式制作
●剩下的就是怎么去调整数据源来制作(用分割线,用0角度区分,不等分等)
●辅助标签,可以用辅助数据,加一个饼图或者圆环图来制作(教程里用的饼图,我们也可以用圆环图,他们的区别在于饼图标签可以放到外面,圆环图的标签只能放到里面)
●这里我把我写的代码贴上来,只要选中数据源,执行Main程序就好了,不同效果只要改下调用子程序的名字和参数就好(不会用的就不详细教学了)
'=============================='by-大鹅'选中要计算的数据范围,调用2个程序一个是等分的数据结构'一个是不等分的数据结构'==============================Sub Main()做不等分的数据区域 False, TrueEnd Sub'--------------------------------------------'注意只支持单列数据选择'这个是等分的算法'1参数【真】表示一列,【假】表示多列'2参数[真]表示有分割间距,[假]表示没分割间距'--------------------------------------------Sub 做数据区域(blkz AsBoolean, ju AsBoolean)Dim lngCount&, rng AsRange, lngJD&, r AsRangeDim n&, i&, y&Set rng = Selection '先去选中你要做数据的范围(只能单列选择,不要整列选择)lngCount = rng.CountlngJD = 360 / lngCount '得到角度Sheet2.Cells.ClearContentsIf blkz = TrueThenForEach r In rngFor i = 1To lngJDn = n + 1Sheet2.Range("a" & n).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThenn = n + 1Sheet2.Range("a" & n).Value = 0EndIfNextElseForEach r In rngy = y + 1For i = 1To lngJDn = n + 1Sheet2.Cells(n, y).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThenn = n + 1Sheet2.Cells(n, y).Value = 0EndIfNextEndIfEnd Sub'--------------------------------------------'注意只支持单列数据选择'这个是【不等分】的算法'1参数【真】表示一列,【假】表示多列'2参数[真]表示有分割间距,[假]表示没分割间距'--------------------------------------------Sub 做不等分的数据区域(blkz AsBoolean, ju AsBoolean)Dim lngCount&, rng AsRange, lngSum&, r AsRange, lngJD&Dim n&, i&, y&Set rng = Selection '先去选中你要做数据的范围(只能单列选择,不要整列选择)lngCount = rng.CountlngSum = Application.Sum(rng) '得到总数据Sheet2.Cells.ClearContentsIf blkz = TrueThenForEach r In rngy = y + 1If y = lngCount ThenlngJD = IIf(ju = False, 360, 367) - nElselngJD = r.Value / lngSum * 360EndIfFor i = 1To lngJDn = n + 1Sheet2.Range("a" & n).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThenn = n + 1Sheet2.Range("a" & n).Value = 0EndIfNextElseForEach r In rngy = y + 1If y = lngCount ThenlngJD = IIf(ju = False, 360, 367) - nElselngJD = r.Value / lngSum * 360EndIfFor i = 1To lngJDn = n + 1Sheet2.Cells(n, y).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThenn = n + 1Sheet2.Cells(n, y).Value = 0EndIfNextEndIfEnd Sub
今天的分享就到这,如果教程对大家有用,希望大家多多分享点赞支持小编哦!你的每一次点赞和转发都是支持小编坚持原创的动力。
点击阅读原文一键登录官网,海量视频vip任意学!(可试看)
夜雨聆风


