我试图将雷达图的标签与轴对齐,但遇到了困难。
如果不进行标签对齐,我的标签会居中并超出轴线 。
当我将第一半标签(图像右侧)的对齐设置为左对齐,将第二半标签的对齐设置为右对齐时,我得到的对齐方式不是“圆形”的 为此,我在xticklabels中进行循环并设置水平对齐方式。
如果不进行标签对齐,我的标签会居中并超出轴线 。
当我将第一半标签(图像右侧)的对齐设置为左对齐,将第二半标签的对齐设置为右对齐时,我得到的对齐方式不是“圆形”的 为此,我在xticklabels中进行循环并设置水平对齐方式。
# Draw one axe per variable + add labels labels yet
plt.xticks(angles, categories)
for label,i in zip(ax.get_xticklabels(),range(0,len(angles))):
if i<len(angles)/2:
angle_text=angles[i]*(-180/pi)+90
#label.set_horizontalalignment('left')
else:
angle_text=angles[i]*(-180/pi)-90
#label.set_horizontalalignment('right')
label.set_rotation(angle_text)
我猜这个问题有一个正确的解决方法,但我无法想出来,因为我不知道它是否应该考虑偏移量、翻译或如何调整极坐标来实现。
感谢您的帮助。
保罗
以下是完整的代码,以获取更多信息。
from math import pi
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
## Generate Data
labels_test=[]
for i in range(0,40):
labels_test.append("Fooooooooo"+str(i))
pd_radar=pd.DataFrame(data=np.random.randint(low=0, high=10, size=(2, 40)),columns=labels_test)
# number of variable
categories=list(pd_radar)
N = len(categories)
# What will be the angle of each axis in the plot? (we divide the plot / number of variable)
angles = [n / float(N) * 2 * pi for n in range(N)]
# Initialise the spider plot
fig=plt.figure(figsize=(20,10))
ax = plt.subplot(111, polar=True)
# If you want the first axis to be on top:
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
# Draw one axe per variable + add labels labels yet
plt.xticks(angles, categories)
for label,i in zip(ax.get_xticklabels(),range(0,len(angles))):
if i<len(angles)/2:
angle_text=angles[i]*(-180/pi)+90
label.set_horizontalalignment('left')
else:
angle_text=angles[i]*(-180/pi)-90
label.set_horizontalalignment('right')
label.set_rotation(angle_text)
# Draw ylabels
ax.set_rlabel_position(0)
# ------- PART 2: Add plots
# Plot each line of the data
# Ind1
values0=pd_radar.iloc[0].values.flatten().tolist()
ax.plot(angles, values0, linewidth=1, linestyle='solid', label="Label 1",color='yellow')
ax.fill(angles, values0, 'r', alpha=0.1,color='yellow')
# Ind2
values1=pd_radar.iloc[1].values.flatten().tolist()
ax.plot(angles, values1, linewidth=1, linestyle='solid', label="Label 2",color='deepskyblue')
ax.fill(angles, values1, 'r',color='deepskyblue', alpha=0.1)
# Add legend
plt.show()