मैं 14 अलग-अलग श्रेणियों या "पिज्जा स्लाइस" के साथ अजगर में एक पाई रडार/मकड़ी चार्ट उत्पन्न करना चाहता हूं। कुछ ऐसा ही एक्सेल में बनाया गया यह उदाहरण या यह उदाहरण ggplot2 के साथ बनाया गया है

यह plt उदाहरण उपयोगी था (नीचे कोड) , हालांकि विभिन्न श्रेणियों के प्रेक्षणों को उनके अपने अलग सेक्शन ("पिज्जा स्लाइस") रखने के बजाय लाइनों से जोड़ा जाता है। कोई विचार यह कैसे करना है पाइथन है?

import matplotlib.pyplot as plt
import pandas as pd
from math import pi
 
df = pd.DataFrame({
'group': ['A','B'],
'r1': [2, 23],
'r2': [5, 5],
'r3': [1, 9],
'r4': [1, 1],
'r5': [3, 6],
'r6': [0, 0],
'r7': [17, 53],
'r8': [29, 44],
'r9': [0,2],
'r10': [0, 2],
'r11': [0, 3],
'r12': [1, 2],
'r13': [0, 3],
'r14': [0, 0],    
})
 
categories=list(df)[1:]
N = len(categories)     
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]     
fig = plt.figure(figsize=(6,6))
ax = plt.subplot(111, polar=True)
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
plt.xticks(angles[:-1], categories)#, rotation=70)
 
# Draw ylabels
ax.set_rlabel_position(10)
plt.yticks([20,40,60,80,100], ["20","40","60","80","100"], color="black", size=8)
plt.ylim(0,100)
 
values=df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="A")
ax.fill(angles, values, 'b', alpha=0.7)
 
values=df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="B")
ax.fill(angles, values, 'r', alpha=0.1)     
plt.legend(loc='upper right', bbox_to_anchor=(0, 0))

enter image description here

3
user1442363 16 जुलाई 2020, 19:10

1 उत्तर

सबसे बढ़िया उत्तर

एक रडार चार्ट में, आमतौर पर मान गोलाकार कुल्हाड़ी पर एक बिंदु प्रति टिक होते हैं, जो एक ज़िगज़ैग पैटर्न बनाने वाली रेखाओं से जुड़े होते हैं। एक पोलर बार प्लॉट वांछित चार्ट के करीब हो सकता है।

एक पोलर बार प्लॉट एक सामान्य बार प्लॉट के समान होता है, लेकिन एक सर्कल पर मुड़ा हुआ होता है।

बार और लेबल को ग्रिड लाइनों के बीच अच्छी तरह से प्राप्त करने के लिए, थीटा स्थिति को बार की आधी चौड़ाई से स्थानांतरित किया जा सकता है। और ग्रिड लाइनों को उनकी मूल स्थिति में वापस लाने के लिए मामूली टिक का उपयोग किया जा सकता है।

निरंतरता के लिए, नीचे दिया गया कोड कुछ कॉलों को plt. से ax. में भी बदल देता है।

import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator
import pandas as pd
from math import pi
import numpy as np

df = pd.DataFrame({'group': ['A', 'B'], 'r1': [2, 23], 'r2': [5, 5], 'r3': [1, 9], 'r4': [1, 1], 'r5': [3, 6], 'r6': [0, 0], 'r7': [17, 53], 'r8': [29, 44], 'r9': [0, 2], 'r10': [0, 2], 'r11': [0, 3], 'r12': [1, 2], 'r13': [0, 3], 'r14': [0, 0], })

categories = list(df)[1:]
N = len(categories)
angles = np.linspace(0, 2 * pi, N, endpoint=False)
angles_mids = angles + (angles[1] / 2)

fig = plt.figure(figsize=(6, 6))
ax = plt.subplot(111, polar=True)
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
ax.set_xticks(angles_mids)
ax.set_xticklabels(categories)
ax.xaxis.set_minor_locator(FixedLocator(angles))

# Draw ylabels
ax.set_rlabel_position(0)
ax.set_yticks([20, 40, 60, 80, 100])
ax.set_yticklabels(["20", "40", "60", "80", "100"], color="black", size=8)
ax.set_ylim(0, 100)

values0 = df.loc[0].drop('group').values
ax.bar(angles_mids, values0, width=angles[1] - angles[0],
       facecolor='b', alpha=0.7, edgecolor='k', linewidth=1, label="A")

values1 = df.loc[1].drop('group').values
ax.bar(angles_mids, values1, bottom=values0, width=angles[1] - angles[0],
       facecolor='r', alpha=0.7, edgecolor='k', linewidth=1, label="B")

ax.grid(True, axis='x', which='minor')
ax.grid(False, axis='x', which='major')
ax.grid(True, axis='y', which='major')
ax.legend(loc='upper left', bbox_to_anchor=(0.9, 1))
plt.show()

example plot

3
JohanC 17 जुलाई 2020, 09:34