乐于分享
好东西不私藏

Excel教程:南丁格尔玫瑰图详解!这个高颜值图表,让你的汇报惊艳全场

Excel教程:南丁格尔玫瑰图详解!这个高颜值图表,让你的汇报惊艳全场

点击【开通SVIP会员免费学】

这里我们都简称玫瑰图

Excel做玫瑰图最难的其实是数据的构建,怎么把需要的数据结构做出来,结构出来了,图表的制作就非常快了

一、按照惯例,我们还是先看看效果

二、详细聊聊数据结构

●数据源

●先来说下用什么图表来做的

其实我们用的雷达图来做圆形的图表

先看下这个数据源做出来的雷达图效果

传统的雷达图是八个顶角变化来表示分数变化

看上去不够炫,为了让整个一扇全部是分数长度,我们这里可以发散下思维

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

我们叫可以做360°数据源(1行到360行),因为是8个维度,就是360÷8=45个

然后会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 AsRange    Dim n&, i&, y&Set rng = Selection     '先去选中你要做数据的范围(只能单列选择,不要整列选择)    lngCount = rng.Count    lngJD = 360 / lngCount  '得到角度    Sheet2.Cells.ClearContentsIf blkz = TrueThenForEach r In rngFor i = 1To lngJD                n = n + 1                Sheet2.Range("a" & n).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThen                n = n + 1                Sheet2.Range("a" & n).Value = 0EndIfNextElseForEach r In rng            y = y + 1For i = 1To lngJD                n = n + 1                Sheet2.Cells(n, y).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThen                n = n + 1                Sheet2.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.Count    lngSum = Application.Sum(rng)  '得到总数据    Sheet2.Cells.ClearContentsIf blkz = TrueThenForEach r In rng            y = y + 1If y = lngCount Then                lngJD = IIf(ju = False, 360, 367) - nElse                lngJD = r.Value / lngSum * 360EndIfFor i = 1To lngJD                n = n + 1                Sheet2.Range("a" & n).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThen                n = n + 1                Sheet2.Range("a" & n).Value = 0EndIfNextElseForEach r In rng           y = y + 1If y = lngCount Then                lngJD = IIf(ju = False, 360, 367) - nElse                lngJD = r.Value / lngSum * 360EndIfFor i = 1To lngJD                n = n + 1                Sheet2.Cells(n, y).Formula = "=" & r.Address(, , , 1)NextIf ju = TrueThen                n = n + 1                Sheet2.Cells(n, y).Value = 0EndIfNextEndIfEnd Sub

今天的分享就到这,如果教程对大家有用,希望大家多多分享点赞支持小编哦!你的每一次点赞和转发都是支持小编坚持原创的动力。

点击阅读原文一键登录官网,海量视频vip任意学!(可试看)