matplotlib系列(3)-- 绘制二维图表

matplotlib提供了常见二维图表的绘制。

一、数据分布

1、直方图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_hist(title, x):
'''
绘制直方图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.xlabel('x', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 设置坐标轴刻度线
# plt.xticks(rotation=-30) # 刻度倾斜一定角度
# plt.yticks([1,5,8,15,24], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
# ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16, colors='g') # 坐标轴刻度格式
ax.xaxis.set_major_locator(plt.MultipleLocator(1)) # 坐标轴刻度间隔1
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 移动坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0)) # 将bottom即是x坐标轴设置到y=0的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 将left即是y坐标轴设置到x=0的位置

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
ax.hist(x,
bins=25, # 分段数量
width=0.2, # 宽度
alpha=0.5, # 不透明度
#facecolor='white', # 柱形填充颜色
#hatch='/', # 图形填充形状,可选['/', '', '|', '-', '+', 'x', 'o', 'O', '.', '*']
#edgecolor='darkblue' # 边缘颜色
)

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.random.normal(0,1,1000)
plot_hist('测试图', x)

如果只需要简单的计算每段区间的样本数,而并不想画图显示它们,那么可以直接用np.histogram()

1
2
3
4
5
import numpy as np

x = np.random.normal(0,1,1000)
counts, bin_edges = np.histogram(x, bins=50)
print(counts)

2、箱形图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_box(title, data, labels):
'''
绘制箱形图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
ax.xaxis.set_tick_params(labelsize=16)
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 消除边框
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
bplot = ax.boxplot(data,
widths=0.2, # 设置箱体宽度
patch_artist=True, # 箱体是否染色
notch=False, # 中位线处不设置凹陷
medianprops={'linestyle':'--','color':'green','markerfacecolor':'indianred', 'markersize':4}, # 设置均值点的属性, 如点的形状、填充色和点的大小
# flierprops={'marker':'o','markerfacecolor':'red', 'markersize':3}, # 设置异常点属性, 如点的形状、填充色和点的大小
labels=labels # 标签
)
colors =["pink", "lightgreen","pink", "lightgreen"]
for i, item in enumerate(bplot["boxes"]):
item.set_facecolor(colors[i])

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

data = [
[1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2500],
[1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100],
[1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
[800, 1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900]
]
labels =["China","America","Britain","Russia"]

plot_box('测试图', data, labels)

3、小提琴图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_violin(title, data, labels):
'''
绘制小提琴图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
ax.xaxis.set_tick_params(labelsize=16)
ax.set_xticks([i+1 for i in range(len(data))])
ax.set_xticklabels([labels[i] for i in range(len(data))])
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 消除边框
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
vplot = ax.violinplot(data,
vert=True, # 是否竖直显示
showmedians=True, # 显示中位数
showmeans=False # 显示平均数
)
for item, color in zip(vplot['bodies'], ['cyan', 'red', 'blue', 'green', 'purple']):
item.set(facecolor=color, alpha=0.5)
for item in ['cbars', 'cmaxes', 'cmins', 'cmedians']:
plt.setp(vplot[item], edgecolor='gray', linewidth=1.5)
plt.setp(vplot['cmedians'], edgecolor='black')

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

data = [
[1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2500],
[1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100],
[300, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000],
[800, 1000, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900]
]
labels =["China","America","Britain","Russia"]

plot_violin('测试图', data, labels)

二、数据比较

1、柱形图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_bar(title, x, y):
'''
绘制柱形图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴和标签设定
plt.title(title, fontsize=22)
plt.xlabel('xlabel', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.xlim(-1, 5)
plt.ylabel('ylabel', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylim(-2, 30)

# 设置坐标轴刻度线
plt.yticks([1,5,8,15,24], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
# ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16, colors='g') # 坐标轴刻度格式
ax.xaxis.set_major_locator(plt.MultipleLocator(1)) # 坐标轴刻度间隔1
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 移动坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0)) # 将bottom即是x坐标轴设置到y=0的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 将left即是y坐标轴设置到x=0的位置

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
rects = ax.bar(x, y,
width=0.5, # 宽度
alpha=0.5, # 不透明度
#facecolor='white', # 柱形填充颜色
#hatch='/', # 图形填充形状,可选['/', '', '|', '-', '+', 'x', 'o', 'O', '.', '*']
#edgecolor='darkblue' # 边缘颜色
)
# 为柱状图添加高度值
for rect in rects:
x = rect.get_x()
height = rect.get_height()
ax.text(x+0.2, 1.01*height, str(height), fontsize=16)

# plt.legend(fontsize=16, loc='upper right') # 标签设定
# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.arange(1, 5, 1)
y = np.array([15,20,18,25])
plot_bar('测试图', x, y)

2、雷达图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_radar(title, p1, p2):
'''
绘制雷达图
'''
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121, polar=True) # 坐标轴为极坐标体系
ax2 = fig.add_subplot(122, polar=True)
fig.subplots_adjust(wspace=0.4) # 设置子图间的间距为子图宽度的40%

data1 = np.array([i for i in p1.values()]).astype(int)
data2 = np.array([i for i in p2.values()]).astype(int)
label = np.array([j for j in p1.keys()]) # 提取标签

angle = np.linspace(0, 2*np.pi, len(data1), endpoint=False) # data里有几个数据,就把整圆360°分成几份
angles = np.concatenate((angle, [angle[0]])) # 增加第一个angle到所有angle里,以实现闭合

data1 = np.concatenate((data1, [data1[0]])) # 增加第一组数据的第一个值到第一组数据所有的值里,以实现闭合
data2 = np.concatenate((data2, [data2[0]])) # 增加第二组数据的第一个值到第二组数据所有的值里,以实现闭合

label = np.concatenate((label, [label[0]])) # 对labels进行封闭

# 设置第一个坐标轴
ax1.set_thetagrids(angles*180/np.pi, label) # 设置网格标签
ax1.plot(angles,data1,"o-")
ax1.set_theta_zero_location('NW') # 设置极坐标0°位置
ax1.set_rlim(0,100) # 设置显示的极径范围
ax1.fill(angles,data1,facecolor='g', alpha=0.2) # 填充颜色
ax1.set_title("甲",fontproperties="SimHei",fontsize=16) # 设置标题

# 设置第二个坐标轴
ax2.set_thetagrids(angles*180/np.pi, label) # 设置网格标签
ax2.plot(angles,data2,"o-")
ax2.set_theta_zero_location('NW') #设置极坐标0°位置
ax2.set_rlim(0,100) # 设置显示的极径范围
ax2.fill(angles,data2,facecolor='g', alpha=0.2) # 填充颜色
ax2.set_title("乙",fontproperties="SimHei",fontsize=16) # 设置标题

plt.show()

p1={"编程能力":60,"沟通技能":70,"专业知识":65,"团体协作":75,"工具掌握":80} #创建第一个人的数据
p2={"编程能力":70,"沟通技能":60,"专业知识":75,"团体协作":65,"工具掌握":70} #创建第二个人的数据
plot_radar('测试图', p1, p2)

3、折线图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_line(title, x, y):
'''
绘制折线图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.xlabel('x', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 设置坐标轴刻度线
# plt.yticks([1,5,8,15,24], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
# ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16, colors='g') # 坐标轴刻度格式
ax.xaxis.set_major_locator(plt.MultipleLocator(5)) # 坐标轴刻度间隔5
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 移动坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0)) # 将bottom即是x坐标轴设置到y=0的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 将left即是y坐标轴设置到x=0的位置

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
ax.plot(x, y,
linewidth = 3, # 线宽
linestyle=':', # 线的风格(-是实线,:是虚线)
alpha=0.5, # 不透明度
color='black', # 折线颜色
label='a' # 标签
)

plt.legend(fontsize=16, loc='upper right') # 标签设定
# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.arange(50)
y = x**2+4
plot_line('测试图', x, y)

三、数据关系

1、散点图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_scatter(title, x, y):
'''
绘制散点图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.xlabel('x', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 设置坐标轴刻度线
# plt.yticks([1,5,8,15,24], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16) # 坐标轴刻度格式
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 移动坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0)) # 将bottom即是x坐标轴设置到y=0的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 将left即是y坐标轴设置到x=0的位置

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
ax.scatter(x, y,
alpha =0.8 # 不透明度
)

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.random.random(100)*10
y = np.random.random(100)*10
plot_scatter('测试图', x, y)

2、气泡图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_bubble(title, x, y, s):
'''
绘制气泡图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴和标签设定
plt.title(title, fontsize=22)
plt.xlabel('x', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylabel('y', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 设置坐标轴刻度线
# plt.yticks([1,5,8,15,24], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16) # 坐标轴刻度格式
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 移动坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0)) # 将bottom即是x坐标轴设置到y=0的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0)) # 将left即是y坐标轴设置到x=0的位置

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 绘图
ax.scatter(x, y,
s=s, # 点的面积
c=np.random.choice(['red','blue'], 100), # 点的颜色
alpha =0.8 # 不透明度
)

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.random.random(100)*10
y = np.random.random(100)*10
s = np.random.random(100)*300 # 点的面积
plot_bubble('测试图', x, y, s)

四、数据成分

1、饼图

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
#-*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_pie(title, sizes, labels, explode):
'''
绘制饼图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题设定
plt.title(title, fontsize=22)

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
ax.set_aspect('equal') # 坐标轴等比例

# 绘图
ax.pie(sizes, # 百分比(list)
autopct='%1.1f%%', # 百分比显示设置
labels=labels, # (每一块)饼图外侧显示的说明文字
startangle=150, # 开始绘制的角度
explode=explode, # (每一块)离开中心距离
shadow=False # 在饼图下面画一个阴影。默认值:False,即不画阴影
)

# plt.savefig("./"+title+".png") # 保存图片
plt.show()

sizes = [2,5,12,70,2,9]
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
explode = (0,0,0,0.1,0,0)
plot_pie('饼图示例-某家庭支出', sizes, labels, explode)

2、堆积柱形图

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
#-*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

# 正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
# 正常显示负号
plt.rcParams['axes.unicode_minus']=False

# print(plt.style.available)
plt.style.use('seaborn-paper')

def plot_stackedbar(title, x, ys):
'''
绘制堆积柱形图
'''
fig, ax = plt.subplots(figsize=(16,10), dpi= 80) # 创建一个画板

# 标题、坐标轴设定
plt.title(title, fontsize=22)
plt.xlabel('xlabel', fontsize=16, fontfamily='sans-serif',fontstyle='italic')
plt.ylabel('ylabel', fontsize=16, fontfamily='sans-serif',fontstyle='italic')

# 是否显示网格
ax.grid(False)

# 坐标轴的一些属性设定
# ax.set_aspect('equal') # 坐标轴等比例
ax.xaxis.set_tick_params(labelsize=16, colors='g') # 坐标轴刻度格式
ax.yaxis.tick_right() # y轴坐标布局位置
ax.yaxis.set_tick_params(labelsize=16)

# 消除边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

t = 0
for y, c, label in zip(ys, ['r', 'g', 'c'], ['label1', 'label2', 'label3']):
plt.bar(x, y, width=0.2, bottom=t, color=c, label=label)
t += y

plt.legend(fontsize=16, loc='upper right') # 标签设定
# plt.savefig("./"+title+".png") # 保存图片
plt.show()

x = np.linspace(0, 5, 20)
y1 = np.random.randint(50, 100, 20)
y2 = np.random.randint(50, 100, 20)
y3 = np.random.randint(50, 100, 20)
plot_stackedbar('测试图', x, [y1,y2,y3])

50张matplotlib图表