带标签两个图例的雷达图
# 新雷达图2019-6-11 11:01:29
import tempfile
import matplotlib.pyplot as plt
import numpy as np
# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
def get_new_radar(title, x_tick_labels, data1, data2):
# 使用ggplot的绘图风格
# plt.style.use('ggplot')
# 构造数据
values = data1
values2 = data2
feature = x_tick_labels
# feature = []
# for i, j in zip(x_tick_labels, data1):
# summ = i + '\n'+str(j)
# feature.append(summ)
N = len(values)
# 设置雷达图的角度,用于平分切开一个圆面
angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
# 为了使雷达图一圈封闭起来,需要下面的步骤
values = np.concatenate((values, [values[0]]))
values2 = np.concatenate((values2, [values2[0]]))
angles = np.concatenate((angles, [angles[0]]))
# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
# 绘制折线图
ax.plot(angles, values, 'o-', linewidth=2, label='各校平均分')
# 填充颜色
ax.fill(angles, values, alpha=0.25)
# 绘制第二条折线图 'o:'设置虚线
ax.plot(angles, values2, 'o:', linewidth=2, label='联考平均分', )
ax.fill(angles, values2, alpha=0.25)
# 添加每个特征的标签
ax.set_thetagrids(angles * 180 / np.pi, feature, size=6)
# 设置雷达图的范围 可以控制间隔
ax.set_ylim(min(data1) * 0.9, max(data1) * 1.01)
# 添加标题 y=1.1 控制
plt.title(title, y=1.2)
ax.spines['polar'].set_visible(False) # 将轴隐藏
# 取消标签显示 labelsize = '0' labelcolor 标签颜色
ax.tick_params('y', labelcolor='#4472C4', labelsize='0')
# 添加网格线
ax.grid(True)
# 添加文字
for x, y in zip(angles[:-1],data1):
plt.text(x, y, '%s' % y, size=7)
# 设置图例
plt.legend(loc='best', ncol=2, bbox_to_anchor=(0.8, 1.2), frameon=False)
result = tempfile.mktemp('.jpg', prefix='bar_radar')
plt.savefig(result, dpi=300, format="jpg", bbox_inches="tight") # 不要限定图片格式
plt.show()
plt.close()
return result
if __name__ == '__main__':
labels = ['物理', '英语', '数学', '语文', '地理', '历史', '政治', '生物', '化学', '地理A', '地理B', '地理C', '法语']
data1 = [0.88, 0.69, 0.98, 0.38, 0.66, 0.54, 0.57, 0.74, 0.82,0.54, 0.57, 0.74, 0.82]
data2=[0.7] * len(data1)
# labels = ['株洲市第八中学', '株洲市第四中学', '浏阳市第一中学', '醴陵市第一中学', '攸县第一中学', '株洲市第二中学']
# # data1 = [88, 92.5, 97.6, 98, 98.3, 100.1]
# # # 联考平均分
# # data2 = [96.8] * len(data1)
# labels = ['株洲市第二中学', '浏阳市一中', '攸县第一中学', '醴陵市第一中学', '株洲市第四中学', '株洲市第八中学']
# data1 = [696.8, 667.9, 666.5, 650.9, 543.1, 503.1]
# # 联考平均分
# data2 = [639.6] * len(data1)
print(get_new_radar("雷达图", labels, data1, data2))
最终效果