import matplotlib
import matplotlib.pyplot as plt
import numpy as np
def auto_text(rects):
for rect in rects:
ax.text(rect.get_x(), rect.get_height(), rect.get_height(), ha='left', va='bottom')
labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]
women2_means = [27, 21, 33, 29, 21]
index = np.arange(len(labels))
width = 0.2
fig, ax = plt.subplots()
rect1 = ax.bar(index - width / 3, men_means, color ='red', width=width, label ='Men')
rect2 = ax.bar(index + width*2 / 3, women_means, color ='springgreen', width=width, label ='Women',hatch='...')
rect3 = ax.bar(index + width*5 / 3, women2_means, color ='blue', width=width, label ='Women2',hatch='//')
ax.set_title('Scores by gender')
ax.set_xticks(ticks=index)
ax.set_xticklabels(labels)
ax.set_ylabel('Scores', fontsize=13)
ax.set_ylim(0, 50)
auto_text(rect1)
auto_text(rect2)
auto_text(rect3)
ax.legend(loc='upper right', frameon=False)
fig.tight_layout()
plt.savefig('2.tif', dpi=300)
plt.grid()
plt.show()
法2:黑白图。
import matplotlib.pyplot as plt
import pandas as pd
labels = ['吉祥物公仔','校服','文化摆件','实用工具','纪念日产品','其他']
y1 = [19.3,19.3,17.96,24.93,16.09,2.41]
y2 = [32.97,12.03,12.67,20.43,21.2,0.71]
y3= [11.32,13.21,18.87,24.53,30.19,1.89]
fig,ax = plt.subplots(1,1,figsize=(8,4.5))
x = np.arange(len(labels))
total_width, n = 0.8, 3
width = total_width / n
x = x - (total_width - width) / 2
label_font = {
'weight':'bold',
'size':14,
'family':'simsun'
}
colors = ['#9999FF','#58C9B9','#CC33CC','#D1B6E1','#99FF99','#FF6666']
rects1 = ax.bar(x, y1, width, label='学生',ec='k',color='w',lw=.8,
hatch='xxx')
rects2 = ax.bar(x + width, y2, width, label='教师',ec='k',color='w',
lw=.8,hatch='//')
rects3 = ax.bar(x + width * 2, y3, width, label='校友',ec='k',color='w',
lw=.8,hatch='---')
# tick_params参数刻度线样式设置
# ax.tick_params(axis=‘x’, tickdir=‘in’, labelrotation=20)参数详解
# axis : 可选{‘x’, ‘y’, ‘both’} ,选择对哪个轴操作,默认是’both’
# which : 可选{‘major’, ‘minor’, ‘both’} 选择对主or副坐标轴进行操作
# direction/tickdir : 可选{‘in’, ‘out’, ‘inout’}刻度线的方向
# color : 刻度线的颜色,我一般用16进制字符串表示,eg:’#EE6363’
# width : float, 刻度线的宽度
# size/length : float, 刻度线的长度
# pad : float, 刻度线与刻度值之间的距离
# labelsize : float/str, 刻度值字体大小
# labelcolor : 刻度值颜色
# colors : 同时设置刻度线和刻度值的颜色
# bottom, top, left, right : bool, 分别表示上下左右四边,是否显示刻度线,True为显示
ax.tick_params(which='major',direction='in',length=5,width=1.5,labelsize=11,bottom=False)
ax.tick_params(axis='x',labelsize=11,bottom=False,labelrotation=0)
ax.set_xticks(range(len(labels)))
ax.set_ylim(ymin = 0,ymax = 40)
# 0 - 1800 ,200为一个间距
ax.set_yticks(np.arange(0,41,10))
ax.set_ylabel('(占比)',fontdict=label_font)
ax.set_xticklabels(labels,fontdict=label_font)
ax.legend(prop =label_font)
'''
# 设置有边框和头部边框颜色为空right、top、bottom、left
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
'''
# 上下左右边框线宽
linewidth = 2
for spine in ['top','bottom','left','right']:
ax.spines[spine].set_linewidth(linewidth)
# Add some text for labels, title and custom x-axis tick labels, etc.
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3),
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
autolabel(rects3)
fig.tight_layout()