前言
本文目标在于利用
最近在处理某一组成绩数据的时候,涉及了柱状图的画法,因此此处进行一下记录。
加载库
import matplotlib.pyplot as plt
import matplotlib.font_manager as mfm
from matplotlib import style
style.use('ggplot') # 加载'ggplot'风格
# 加载中文字体
font_path = "/System/Library/Fonts/STHeiti Light.ttc" # 本地字体链接
prop = mfm.FontProperties(fname=font_path)
单一柱图
其中 表示分数在
total = [3, 5, 6, 7, 8, 6, 4, 3, 3, 22, 4, 8, 7, 13, 7, 7, 15, 10, 6, 52, 8, 2, 3, 26, 1, 1, 0, 2, 0, 3]
如果直接对于上述数据执行下述代码,将得到如下结果。
plt.bar(range(len(total)), total)
plt.title('单一柱图', fontproperties=prop)
plt.savefig("单一柱图.png", dpi=700, fontproperties=prop)
plt.show()
不难发现,上述结果的效果不好。首先第一点,分数段是 ,而此处显示的是 后的数值。其次,最后一根柱子没有数据显示,但其实应该显示
自定义横坐标
因此我们选择自定义横坐标的方式来进行效果改进,具体代码如下。
x_labels = []
for item in range(0, 300, 10):
x = item + 10
if x == 10:
x_labels.append("{}~{}".format(0, 10))
elif x % 50 == 0:
x_labels.append("{}".format(x))
else:
x_labels.append(None)
x = range(len(total))
plt.bar(x, total)
plt.title('单一柱图', fontproperties=prop)
plt.xticks(x, x_labels)
plt.savefig("单一柱图.png", dpi=700, fontproperties=prop)
plt.show()
横坐标还可以调整字体大小以及旋转角度:
plt.xticks(x, x_labels, rotation=30, fontsize=5)
我们在 个区间中仅选取了一部分进行标注,以及令第一个区间以 的方式进行显示。
多柱图
在展示完单一柱图之后,我们进入多柱同时显示的代码内容。首先是数据内容的展示, 表示第 题得分在
A = [[28, 3, 5, 6, 3, 7, 2, 4, 9, 95],
[58, 6, 13, 13, 5, 12, 17, 11, 10, 102],
[60, 22, 21, 41, 11, 5, 1, 2, 3, 4]]
然后我们执行下述代码即可得到下述多柱图。
# 生成横坐标
x_labels = []
for item in range(0, 100, 10):
x = item + 10
if x == 10:
x_labels.append("{}~{}".format(0, 10))
else:
x_labels.append("{}".format(x))
# 生成横坐标范围
x = np.arange(10)
# 生成多柱图
plt.bar(x + 0.00, A[0], color='orange', width=0.3, label="A")
plt.bar(x + 0.30, A[1], color='royalblue', width=0.3, label="B")
plt.bar(x + 0.60, A[2], color='brown', width=0.3, label="C")
# 图片名称
plt.title('多柱图', fontproperties=prop)
# 横坐标绑定
plt.xticks(x + 0.30, x_labels)
# 生成图片
plt.legend(loc="best")
plt.savefig("多柱图.png", dpi=700, fontproperties=prop)
plt.show()
其它参数示例
最后,我们尝试一下改变图形风格,以及将 y 轴变为 log 型增长。另外,其中的 hatch
参数为柱子上的阴影选项,例如可以为 '\\'
。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
plt.figure(figsize=(15, 5), dpi=70) # 设置图像大小
x_labels = ['adult-a', 'cod-rna', 'gisette', 'madelon', 'magic04', 'mini-boo-ne', 'mushrooms', 'phishing', 'real-sim', 'splice', 'w8a']
x_values = [
[6.089643839999999, 5.344304520000001, 0.4359904, 9.83603284, 6.41019676, 308.755843, 0.03612756, 0.8888024399999999, 3.5747096, 0.5192512, 1.53061884],
[4.4124038, 5.535605, 244.2987548, 10.5653444, 2.2559656, 59.1372296, 1.5807804, 2.9477072000000004, 32.0803932, 1.7867012000000002, 7.2184973999999995],
[3.7415935999999994, 0.5491254000000001, 3.1457894, 0.10271919999999998, 0.0997276, 298.7826466, 0.26350219999999996, 0.1412342, 7.425538800000001, 0.0494696, 3.9464446000000004]
]
models = ['SVM', 'ODM', 'IODM']
color = ['#4473c5', '#ec7e32', '#a5a5a5']
hatch = ['', '', '']
def draw_time(models, x_labels, x_values, color, hatch):
plt.cla()
x = np.arange(len(x_labels)) * 2
for i in range(3):
plt.bar(x + 0.5 * i, x_values[i], color=color[i], hatch=hatch[i], width=0.5, label=models[i], edgecolor='black', linewidth=0.2, alpha=1)
plt.xticks(x + 0.60, x_labels)
ax = plt.gca()
ax.set_yscale('log', basey=10)
## ax.set_yticks([10**(-2), 10**(-1), 10**(0), 10**(1), 10**(2)])
plt.legend(loc="best", prop={"size":14})
plt.xlabel('Data sets', fontsize=16)
plt.ylabel('CPU time (sec)', fontsize=16)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.rc('axes', axisbelow=True)
plt.grid(linestyle = '--', linewidth = 0.3, color= 'gray', alpha = 0.2)
plt.savefig('time.pdf', dpi=700)
draw_time(models, x_labels, x_values, color, hatch)
一些配色方案
#82b0d0 蓝
#bebad8 紫
#fbb56d 橙
#f88275 红
#f7cfcd 红
#dae8fb 蓝
#d6e8d5 绿
#fff2cf 黄
#e1d5e6 紫
#bac8d2 灰
配色网站参考:
后记
至此,Python 柱状图
的基础操作就介绍完毕了,本文也算是对于上一篇 《一次性掌握所有 Python 画图基础操作》 文章的一个补充,不过仍然还有很多其他类型图的画法没有介绍,感兴趣的朋友可以继续深入研究!