我需要一个雷达图来可视化一些关键数据。
因此,我从here处获取了代码,并对其进行了一些更改,以适应我的需求。
这是我用于雷达图的代码:
%matplotlib inline
import matplotlib.pyplot as plt
from math import pi
f = plt.figure(figsize=(10,5))
categories=['consistency', 'correctness', 'completeness']
N = len(categories)
values=[59,80,60]
values += values[:1]
values
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
ax = f.add_subplot(111, polar=True)
plt.xticks(angles[:-1], categories, color='grey', size=8)
ax.set_rlabel_position(180)
plt.yticks([20,40,60,80,100], ["20","40","60","80","100"], color="grey", size=10)
plt.ylim(0,100)
ax.plot(angles, values, 'o-', linewidth=1, linestyle='solid')
ax.fill(angles, values, 'b', alpha=0.1)
我注意到的一件事是,标签很接近雷达图,如您所见here,因为它们比雷达图示例中使用的标签长。
答案 0 :(得分:0)
答案 1 :(得分:0)
所提供的解决方案没有考虑方向和偏移。 在我的雷达图中,我的偏移量为 pi/2,因此第一个轴位于顶部(而不是右侧)和方向 -1(因此轴位于顺时针方向,而不是默认的逆时针方向)
# If you want the first axis to be on top:
ax.set_theta_offset(pi / 2)
# If you want labels to go clockwise (counterclockwise is default)
ax.set_theta_direction(direction='clockwise')
无论如何,我稍微修改了您的解决方案以包括这些:
rstep = int(ax.get_theta_direction())
if rstep > 0:
rmin = 0
rmax = len(angles)
else:
rmin = len(angles)-1
rmax = -1
for label, i in zip(ax.get_xticklabels(), range(rmin, rmax, rstep)):
angle_rad = angles[i] + ax.get_theta_offset()
if angle_rad <= pi / 2:
ha = 'left'
va = "bottom"
elif pi / 2 < angle_rad <= pi:
ha = 'right'
va = "bottom"
elif pi < angle_rad <= (3 * pi / 2):
ha = 'right'
va = "top"
else:
ha = 'left'
va = "top"
label.set_verticalalignment(va)
label.set_horizontalalignment(ha)
请注意,答案中的“else:”位也有一个小错误。 ha/va 设置为右侧/底部,它应该在那里的左侧/顶部。 (示例图表不明显,因为它在该象限中没有标签)。