我从这个答案中找到了一个很好的例子,可以在 python 的 matplotlib 中绘制雷达图。我的 xtick 标签很长,可以延伸到雷达图中。因此,标签文本被线条覆盖...
答案 中找到了一个很好的例子,可以在 python 的 matplotlib 中绘制雷达图 .
我的 xtick 标签很长,延伸到了雷达图内。因此,标签文本被雷达图的线条覆盖,如下面的屏幕截图所示。不幸的是,标签甚至从图表区域被切断了。我已经尝试过 plt.tight_layout()
修复它,但没有成功。
有没有办法:
p4
p5
并获取图表区域中的所有标签,以便它们不会被切断?
我使用的代码是:
将 pandas 导入为 pd 将 numpy 导入为 np 从 matplotlib 导入 pyplot 为 plt
def create_radar(df, *, id_column, title=None, max_values=None, padding=1.25, width=9, length=9):
cm = 1/2.54
categories = df._get_numeric_data().columns.tolist()
data = df[categories].to_dict(orient='list')
ids = df[id_column].tolist()
if max_values is None:
max_values = {key: padding*max(value) for key, value in data.items()}
normalized_data = {key: np.array(value) / max_values[key] for key, value in data.items()}
num_vars = len(data.keys())
tiks = list(data.keys())
tiks += tiks[:1]
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist() + [0]
fig, ax = plt.subplots(figsize=(width*cm, length*cm), subplot_kw=dict(polar=True))
for i, model_name in enumerate(ids):
values = [normalized_data[key][i] for key in data.keys()]
actual_values = [data[key][i] for key in data.keys()]
values += values[:1] # Close the plot for a better look
ax.plot(angles, values, label=model_name)
ax.fill(angles, values, alpha=0.15)
for _x, _y, t in zip(angles, values, actual_values):
if isinstance(t, float) and t > 1:
t = f'{t:.0f}'
elif isinstance(t, float) and t <= 1:
t = f'{t:.2%}'
else:
str(t)
if i % 2 == 0:
ax.text(_x, _y+.02, t, size='xx-small', va='top', ha='right')
else:
ax.text(_x, _y-.02, t, size='xx-small', va='bottom', ha='left')
ax.fill(angles, np.ones(num_vars + 1), alpha=0.05)
ax.set_yticklabels([])
ax.set_xticks(angles)
#pos_list = np.arange(len(tiks))
#ax.xaxis.set_major_locator(FixedLocator((pos_list)))
#ax.xaxis.set_major_formatter(FixedFormatter((tiks)))
ax.set_xticklabels(tiks, size="xx-small")
ax.legend(loc='lower right',
#bbox_to_anchor=(0.1, 0.1)
)
if title is not None:
plt.suptitle(title)
plt.show()
radar = create_radar
create_radar(
pd.DataFrame({
'x': [*'abcde'],
'supeeeer long category name 1': [10,11,12,13,14],
'supeeeer long category name 2': [0.1, 0.3, 0.4, 0.1, 0.9],
'supeeeer long category name 4': [1e5, 2e5, 3.5e5, 8e4, 5e4],
'supeeeer long category name 5': [9, 12, 5, 2, 0.2],
'supeeeer long category name 6': [1,1,1,1,5]
}),
id_column='x',
)
生成: