帶標籤兩個圖例的雷達圖
# 新雷達圖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))
最終效果