学术论文黑白柱状图绘制
一. 前言
在学术论文中,当涉及黑白打印时 ,彩色的柱状图往往很难有效地区分,因此我们需要绘制黑白柱状图,并通过添加不同的条纹来实现柱状图的区分。
接下来我将以下面这组数据为例,绘制几款比较常见的柱状图。
# 数据代表一年12个月小明和小刚的智商(纯属捏造)
x = [for i in range(1,13)]
xiaoming = [111,124,101,132,127,114,140,135,104,120,101,118]
xiaogang = [132,142,121,101,114,135,126,116,105,131,97,102]
二. 柱形图绘制
2.1 基础绘制
import numpy as np
import matplotlib.pyplot as plt
# 数据代表一年12个月小明和小刚的智商(纯属捏造)
x = [i for i in range(1,13)]
xiaoming = [111,124,101,132,127,114,140,135,104,120,101,118]
xiaogang = [132,142,121,101,114,135,126,116,105,131,97,102]
plt.rcParams['font.family'] = ['Times New Roman']
fig,ax = plt.subplots(1,1,figsize=(7,4.5),dpi=200)
width = 0.35 # 柱子宽度
#字体设置
label_font = {
'weight':'bold',
'size':14,
'family':'SimHei'
}
rects = ax.bar(x, xiaoming, width ,ec='k',color='white', #x代表刻度值范围
lw=.8,hatch='//')
ax.tick_params(axis='x',direction='out',length=5,width=1.5,labelsize=11,bottom=True)#x轴刻度设置
ax.set_xlabel('月份',fontdict=label_font) #x轴名称
#set_xticks(x)和set_xticklabels(x)一般一起使用
ax.set_xticks(x) #设置显示刻度标签的位置,最好与ax.bar的第一个参数一致
ax.set_xticklabels(x)#设置刻度值对应的标签,可以是字符串型
ax.tick_params(axis='y',direction='out',length=5,width=1.5,labelsize=11,bottom=False) #y轴刻度设置
ax.set_ylabel('智商',fontdict=label_font) #y轴名称
ax.set_ylim(ymin = 90,ymax = 150) #y轴刻度范围
ax.set_yticks(np.arange(90,151,10)) #设置显示刻度标签的位置
ax.set_yticklabels(np.arange(90,151,10))#设置刻度值对应的标签,可以是字符串型
ax.axhline(0, color='black',alpha=0.5) #绘制y=0的线
ax.legend(loc='best',markerscale=10,fontsize=12) #设置图例
# 添加数据标签
def autolabel(rects):
for rect in rects:
height = rect.get_height()
if height>0:
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
else:
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, -13), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects)
fig.tight_layout()
#保存图片
#plt.savefig(r'E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\barplot05.png',dpi=600,bbox_inches = 'tight')
ax.bar
函数中的hatch=
参数即可设置柱形图的条纹,包括\,|,/,.,o,+,-,x
等。
2.2 两组数据并列绘制
import numpy as np
import matplotlib.pyplot as plt
# 数据代表一年12个月小明和小刚的智商(纯属捏造)
x = [i for i in range(1,13)]
xiaoming = [111,124,101,132,127,114,140,135,104,120,101,118]
xiaogang = [132,142,121,101,114,135,126,116,105,131,97,102]
#plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = ['Times New Roman']
fig,ax = plt.subplots(1,1,figsize=(7,4.5),dpi=200)
width = 0.35 # 柱子宽度
#字体设置
label_font = {
'weight':'bold',
'size':14,
'family':'SimHei'
}
legend_font = {
'weight':'bold',
'size':10,
'family':'SimHei'
}
rects1 = ax.bar(x = [i - 0.2 for i in x], height = xiaoming, width = width ,ec='k',color='white',
lw=.8, label = "小明", hatch='//')
rects2 = ax.bar(x = [i + 0.2 for i in x], height = xiaogang, width = width ,ec='k',color='white',
lw=.8, label = "小刚", hatch='xxxxxx')
ax.tick_params(axis='x',direction='out',length=5,width=1.5,labelsize=11,bottom=True)#x轴刻度设置
ax.set_xlabel('月份',fontdict=label_font) #x轴名称
#set_xticks(x)和set_xticklabels(x)一般一起使用
ax.set_xticks(x) #设置显示刻度标签的位置,最好与ax.bar的第一个参数一致
ax.set_xticklabels(x)#设置刻度值对应的标签,可以是字符串型
ax.tick_params(axis='y',direction='out',length=5,width=1.5,labelsize=11,bottom=False) #y轴刻度设置
ax.set_ylabel('智商',fontdict=label_font) #y轴名称
ax.set_ylim(ymin = 90,ymax = 150) #y轴刻度范围
ax.set_yticks(np.arange(90,151,10)) #设置显示刻度标签的位置
ax.set_yticklabels(np.arange(90,151,10))#设置刻度值对应的标签,可以是字符串型
ax.axhline(0, color='black',alpha=0.5) #绘制y=0的线
ax.legend(loc='best',markerscale=8,fontsize=10,prop=legend_font) #设置图例
# 添加数据标签
def autolabel(rects):
for rect in rects:
height = rect.get_height()
if height>0:
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
else:
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, -13), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
fig.tight_layout()
#保存图片
#plt.savefig(r'E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\barplot05.png',dpi=600,bbox_inches = 'tight')
2.2 两组数据堆叠绘制
import numpy as np
import matplotlib.pyplot as plt
# 数据代表一年12个月小明和小刚的智商(纯属捏造)
x = [i for i in range(1,13)]
xiaoming = [111,124,101,132,127,114,140,135,104,120,101,118]
xiaogang = [132,142,121,101,114,135,126,116,105,131,97,102]
#plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = ['Times New Roman']
fig,ax = plt.subplots(1,1,figsize=(7,4.5),dpi=200)
width = 0.35 # 柱子宽度
#字体设置
label_font = {
'weight':'bold',
'size':14,
'family':'SimHei'
}
legend_font = {
'weight':'bold',
'size':10,
'family':'SimHei'
}
rects1 = ax.bar(x, height = xiaoming, width = width ,ec='k',color='white',
lw=.8, label = "小明", hatch='//')
rects2 = ax.bar(x, height = xiaogang, width = width ,ec='k',color='white',
lw=.8, label = "小刚", hatch='xxxxxx',bottom = xiaoming)
ax.tick_params(axis='x',direction='out',length=5,width=1.5,labelsize=11,bottom=True)#x轴刻度设置
ax.set_xlabel('月份',fontdict=label_font) #x轴名称
#set_xticks(x)和set_xticklabels(x)一般一起使用
ax.set_xticks(x) #设置显示刻度标签的位置,最好与ax.bar的第一个参数一致
ax.set_xticklabels(x)#设置刻度值对应的标签,可以是字符串型
ax.tick_params(axis='y',direction='out',length=5,width=1.5,labelsize=11,bottom=False) #y轴刻度设置
ax.set_ylabel('智商',fontdict=label_font) #y轴名称
ax.set_ylim(ymin = 90,ymax = 300) #y轴刻度范围
ax.set_yticks(np.arange(90,301,50)) #设置显示刻度标签的位置
ax.set_yticklabels(np.arange(90,301,50))#设置刻度值对应的标签,可以是字符串型
ax.axhline(0, color='black',alpha=0.5) #绘制y=0的线
ax.legend(loc='best',markerscale=8,fontsize=10,prop=legend_font) #设置图例
# 添加数据标签
def autolabel(rects1,rects2):
for i in range(len(rects1)):
rect1 = rects1[i]
rect2 = rects2[i]
height = rect1.get_height()+rect2.get_height()
if height>0:
ax.annotate('{}'.format(height),
xy=(rect2.get_x() + rect2.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
else:
ax.annotate('{}'.format(height),
xy=(rect2.get_x() + rect2.get_width() / 2, height),
xytext=(0, -13), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects1,rects2)
fig.tight_layout()
#保存图片
#plt.savefig(r'E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\barplot05.png',dpi=600,bbox_inches = 'tight')
在ax.bar
函数中设置 bottom
参数 ,表示数据从哪个数开始绘制,该参数的长度应该与将绘制数据的长度相同。
在此案例中,我设置第二个柱形图的bottom
为第一个柱形图的数据,表示第二个柱形图堆叠在第一个柱形图上绘制。若有第三个柱形图想要堆在第二个柱形图上,则需要将前两个柱形图的值相加,可以用如下表达式:[x + y for x, y in zip(xiaoming, xiaogang)]
,第四个、第五个以此类推。