可以直接看文末視頻講解
南丁格爾圖表,又稱為玫瑰圖,是一種常見的商務圖表。它類似于餅圖,都是通過圓形的一個扇區表示大小: 
跟餅圖不同的是,南丁格爾圖表的每個扇區角度都是相同的,它是通過每個扇區的不同高度表示數據的大小。 上面的南丁格爾圖表是基本形式,可以表達一個系列的數據(只有一種顏色),也可以表示多各系列數據(加上紅色),但是最好是一個系列的數據全部小于另外一個系列的數據。如果數據參差不齊,看上去比較混亂,這時,可以采用下面的形式:

二者的主要區別:
在Excel中,并沒有南丁格爾圖表的基本圖表。我們可以通過雷達圖實現這個圖表。

在這個雷達圖中,不同點的大小表現為圖表中不同半徑的圓上的點。這個原理是類似的。
如果我們如下圖一樣,在雷達圖中添加多條長度一樣的線(紅色劃線區域):

就可以實現南丁格爾圖表。

對于這個基本型的南丁格爾圖表,很明顯,每個扇區占的角度=360°/扇區的數量。
因此,我們需要按如下方式制作作圖數據。
首先,原始數據如下: 
B列和C列是需要作圖的不同系列。我們先看B列,我們要將其改造為: 
這樣的數據。簡單說,原來的每個數據,如:分類為A的數值是6301,那么在作圖數據中就需要出現36個6301,這里的36是每個數據占的角度。總共10個分類,每個正好是36。 而且在不同數據之間還要插入一個0值,用于在最終的圖表中形成間隔。
要完成這件事情,可以手工復制粘貼。不用說,這樣的工作比較枯燥繁瑣。我們這里提供兩個方法。 第一種方法是VBA,你可以使用下面的代碼(以下代碼直接復制即可,也可以按照文末的方法跟客服索要模板。需要將 代碼中相應的地方修改為你自己數據的地址,詳細修改方法見視頻講解): '生成基本玫瑰圖數據 Sub ChartData_Basic() '分類數據 Dim RngCat As Range Set RngCat = Worksheets("玫瑰圖-基本").Range("A2:A11")
'展示數據 Dim RngVal As Range Set RngVal = Worksheets("玫瑰圖-基本").Range("B2:B11")
'作圖數據開始單元格 Dim RngChartData As Range Set RngChartData = Worksheets("玫瑰圖-基本").Range("E1")
'生成作圖數據 Dim Count Count = Int((1 + (360 / RngCat.Rows.Count))) Set RngChartData = RngChartData.Resize(Count * RngCat.Rows.Count, 3) For i = 1 To RngCat.Rows.Count * Count If i Mod Count = 1 Then RngChartData(i, 1).Value = 0 Else RngChartData(i, 1).Value = Application.WorksheetFunction.Index(RngVal, 1 + Int(i / (Count + 0.1)))
End If
If (i + Int(Count / 2)) Mod Count > 0 Then
Else RngChartData(i, 2).Value = Application.WorksheetFunction.Index(RngVal, 1 + Int(i / (Count + 0.1))) RngChartData(i, 3).Value = Application.WorksheetFunction.Index(RngCat, 1 + Int(i / (Count + 0.1))) End If
Next i End Sub
如果你用不了VBA代碼,你可以使用下面的方法,不過需要你使用Office 365: 你使用這個公式:
=MAKEARRAY(37*10,1,LAMBDA(r,c,IF(MOD(r,37)=1,0,INDEX(B2:B11,INT(r/(37+0.1))+1))))
這個公式里的37就是36+1,36的含義是每個數據點占據的角度,+1的意思是不同點之間加一個0用于間隔,10表示數據點的個數。你可以將其修改為你需要的值: 例如,如果你有11個數據點,每個的角度是360/11≈35,加上1就是36。 其中的B2:B11是用于展現的數據,你可以改成你自己的地址。
這個公式使用了MAKEARRAY函數,具體請參見我們以前的文章,這里就不詳細介紹了。 選中生成的作圖數據,然后再插入選項卡中選擇雷達圖(第三種類型):

插入圖表:

圖表主體已經做完了。刪掉網格線,坐標軸,分類標簽,就得到了南丁格爾圖表: 
接下來修改顏色。這里顏色的修改實際上是修改數據系列格式中的標記的填充色:

下面還需要添加標簽。 這個標簽也需要輔助的作圖數據。 網上有方法,說的是通過添加一個餅圖,然后添加餅圖的標簽。這個當然是最簡單的,但是,這個方法添加的標簽位置都在扇形的固定位置,不能跟隨扇形大高度變化。所以,我們可以在雷達圖中再次插入系列,這個系列中每個數據點在每個扇區的中間:

這樣的線顯然可以通過類似的公式完成(如果使用上面的VBA代碼,直接就生成了輔助系列的數據):
=MAKEARRAY(37*10,1,LAMBDA(r,c,IF(MOD(r+18,37)>0,"",INDEX(B2:B11,INT(r/(37+0.1))+1))))
得到的數據是這樣的:

對應每個作圖數據,除了中間的點有值外,其余的點都是空的。
將這個數據作為新的系列添加到雷達圖中,然后為這一列添加標簽即可。 如果有另外的系列,就如法炮制: 
可以添加多個系列。但是,除非每個系列的大小是依次減少的,否則,圖表會比較混亂。
如果用于對比的數據參差不齊,可以使用下圖:

其實,這個圖表的做法還是一樣的:

如上圖,實際上黃色系列扇區還是占36°,但是,只有中間的一部分真正有數據,而其他的都是0,而紅色系列扇區也是36°,也只有中間部分真正有數據:

數據就是上面這種形式,紅色數據的起始位置與黃色數據不同。 在模板中也提供了生成對比數據的代碼:
'生成對比玫瑰圖數據 Sub ChartData_Adv() '分類數據 Dim RngCat As Range Set RngCat = Worksheets("玫瑰圖-基本").Range("A2:A11")
'展示數據 Dim RngVal As Range Set RngVal = Worksheets("玫瑰圖-基本").Range("B2:B11")
'作圖數據開始單元格 Dim RngChartData As Range Set RngChartData = Worksheets("玫瑰圖-基本").Range("E1")
'生成作圖數據 Dim Count Count = Int((1 + (360 / RngCat.Rows.Count))) Set RngChartData = RngChartData.Resize(Count * RngCat.Rows.Count, 3) For i = 1 To RngCat.Rows.Count * Count If i Mod Count <= 7 Or i Mod Count >= 30 Then RngChartData(i, 1).Value = 0 Else RngChartData(i, 1).Value = Application.WorksheetFunction.Index(RngVal, 1 + Int(i / (Count + 0.1)))
End If
If (i + Int(Count / 2)) Mod Count > 0 Then
Else RngChartData(i, 2).Value = Application.WorksheetFunction.Index(RngVal, 1 + Int(i / (Count + 0.1))) RngChartData(i, 3).Value = Application.WorksheetFunction.Index(RngCat, 1 + Int(i / (Count + 0.1))) End If
Next i End Sub
如果是Office 365的用戶,可以考慮使用下面的公式: =MAKEARRAY(37*10,1,LAMBDA(r,c,IF(OR(MOD(r,37)<=7,MOD(r,37)>=30 ),0,INDEX(B2:B11,INT(r/(37+0.1))+1))))
其中if中的條件:
OR(MOD(r,37)<=7,MOD(r,37)>=30 )
公式中的7和30決定了0的個數和起始位置,可以自行修改。
聯系客服(底部菜單 -> 知識庫 -> 客服),獲取模板
加入E學會,學習更多Excel應用技巧 http://www./portal/learn/class_list
Excel+Power Query+Power Pivot+Power BI Power Excel 知識庫 按照以下方式進入知識庫學習Excel函數 底部菜單:知識庫->Excel函數自定義函數 底部菜單:知識庫->自定義函數 Excel如何做 底部菜單:知識庫->Excel如何做面授培訓 底部菜單:培訓學習->面授培訓 Excel企業應用 底部菜單:企業應用 也可以在歷史文章中學習Excel,Power Query,Power Pivot,Power BI,Power Automate各種技巧。
|