在matplotlib

时间:2019-03-29 19:28:49

标签: python matplotlib

我需要一个雷达图来可视化一些关键数据。

因此,我从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,因为它们比雷达图示例中使用的标签长。

2 个答案:

答案 0 :(得分:0)

我在评论部分链接的帖子中找到了解决方案。

这是更改后的代码:

li

如您所见here,标签现在正确放置了。

答案 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 设置为右侧/底部,它应该在那里的左侧/顶部。 (示例图表不明显,因为它在该象限中没有标签)。