Matplotlib介绍

Matplotlib是Python的绘图库,可与NumPy搭配使用,非常方便的创建2D图表和基本的3D图表。

绘制柱状图

  • 导入包

    1
    import matplotlib.pyplot as plt
  • 基本语法

    • 坐标轴

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 坐标轴名称
      plt.xlabel('横坐标名字')
      plt.ylabel('纵坐标名字')

      # 坐标轴范围(决定坐标上下界)
      plt.xlim((1,100))
      plt.ylim((1,100))

      #坐标刻度(决定刻度间隔和刻度上下界)
      plt.xticks(range(0,50,5))
      plt.yticks(range(0,50,5))
    • 数字标签

      1
      2
      #plt.text设置文字说明,可用于添加数字标签  x和y是标签的位置
      plt.text(x,y,string)
    • 显示图例

      1
      plt.legend()
    • 显示百分数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #数字标签以百分数显示,fontdict设置字体属性
      plt.text(x,y,s+'%',fontdict={'size':15})

      #纵坐标以百分数显示
      import matplotlib.ticker as ticker

      def to_percent(temp, position):
      return '%1.0f'% temp + '%'

      plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(to_percent))
    • 柱状图填充纹理

      1
      2
      3
      4
      # plt.bar中设置hatch属性来填充纹理,可取值: / , \ , | , - , + , x , o , O , . , * 
      plt.bar(range(len(data)), data, hatch='o')
      #改变纹理密度
      plt.bar(range(len(data)), data, hatch='oo')
    • 查看/保存图表

      1
      2
      3
      4
      # 查看
      plt.show()
      # 保存
      plt.savefig("保存路径/名称.png",dip=xxx)
    • 设置中文

      1
      2
       # pyplot使用rc配置文件自定义图形的各种属性,图表默认不显示中文,通过动态修改rc来设置中文。注意要在绘制图之前设置,即plt.bar之前
      plt.rc('font',family="SimHei",size=12)
  • 多组柱状图实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from turtle import color
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np


def to_percent(temp, position):
return '%1.0f'% temp + '%'


#在柱状上方显示数字
def autolabel(rects):
for rect in rects:
height = rect.get_height()
# plt.text(x,y,string) 调整x,y以适配最佳位置
plt.text(rect.get_x()+rect.get_width()/2-0.08, 5+height, '%s'% float(height),fontdict={'size' :font_size})



def create_multi_bars(labels, datas, tick_step=1, group_gap=0.2, bar_gap=0):
'''
labels : x轴坐标标签序列
datas : 数据集,二维列表,要求列表每个元素的长度必须与labels的长度一致
tick_step : 默认x轴刻度步长为1,通过tick_step可调整x轴刻度步长。
group_gap : 柱子组与组之间的间隙,最好为正值,否则组与组之间重叠
bar_gap : 每组柱子之间的空隙,默认为0,每组柱子紧挨,正值每组柱子之间有间隙,负值每组柱子之间重叠
'''
# ticks为x轴刻度
ticks = np.arange(len(labels)) * tick_step
# 每组柱子的柱子个数
group_num = len(datas)
# group_width为每组柱子的总宽度,group_gap 为柱子组与组之间的间隙。
group_width = tick_step - group_gap
# bar_span为每组柱子之间在x轴上的距离,即柱子宽度和间隙的总和
bar_span = group_width / group_num
# bar_width为每个柱子的实际宽度
bar_width = bar_span - bar_gap+0.03
# baseline_x为每组柱子第一个柱子的基准x轴位置,随后的柱子依次递增bar_span即可
baseline_x = ticks - (group_width - bar_span) / 2
##设置中文显示
plt.rc('font',family="SimHei",size=12)

for index, y in enumerate(datas):
autolabel(plt.bar(baseline_x + index*bar_span, y,bar_width,label=_ylabel[index],color="white",hatch=_hatch[index],ec='k'))

plt.title(title)
plt.legend()
# x轴刻度标签位置与x轴刻度一致
plt.xticks(ticks, labels)
plt.yticks(range(0,y_lim+1,y_gap))
plt.ylim((0,y_lim))

# 显示百分数
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(to_percent))

plt.show()
# plt.savefig("/save_dir.png",dpi=300)

title = "标题"
y_lim = 250
y_gap = 50
font_size = 13
_xlabel = ['x_1','x_2']
_hatch = ["oo","xx","\\\\"]
_ylabel = ['y_1','y_2','y_3']

first = [90.69,20]
second = [70,15.4]
third = [95,26.27]
data = [first,second,third]

if __name__ == "__main__":
create_multi_bars(_xlabel, data, bar_gap=0.1)


  • 双柱状图示例效果

Matplotlib柱状图示例

参考文章