python matplotlib 论文画图代码总结

最近赶了一篇论文,其中涉及到很多实验结果的绘制。最开始使用了pandas自带的plot功能,使用简单,但是很多细节都无法自己调节定制,默认的结果又相当的丑。于是参考了****上各位大佬的分享,这些分享都对在某一方面的某个问题进行详细介绍,链接如下,在此表示感谢:
Python——使用matplotlib绘制柱状图
python中matplotlib的颜色及线条控制: 配色大全,想找漂亮颜色上这里
【Python Matplotlib】设置x/y坐标轴刻度
python matplotlib 画图刻度、图例等字体、字体大小、刻度密度、线条样式设置
python matplot美化+坐标轴范围设置等笔记
本文希望介绍一些在论文写作过程中实际的例子,看看怎样把上面提到的这些内容最后融合到一起。

柱状图绘制

并列柱状图

把以下数据图形化:

Metrics A B C
a 2.5 2.6 2.7
b 2.75 2.85 2.95

其中A,B,C是要比较的对象,a,b是两个评价指标,这里我们要完成几个操作:

  1. 并列柱状图
  2. 由于数值的差距不大,我们不希望y坐标从0开始,而是从某一大于0的值开始,比如2
import matplotlib.pyplot as plt
figure, ax = plt.subplots()
item = ['A','B','C']
num1 = [0.5, 0.6, 0.7]
num2 = [0.75, 0.85, 0.95] #这里对数据进行了截断,所有值都减去了2,只画从2开始的部分
x =list(range(len(num1))) #横坐标
width = 0.4 #每一根“柱”的宽度
plt.yticks([0, 0.2, 0.4, 0.6, 0.8, 1.0], [2.0, 2.2, 2.4, 2.6, 2.8, 3.0])
#设置y坐标,实际数值是前一组,标记数值为后一组
plt.bar(x, num1, width=width, label='a',fc = '#B0C4DE')#画第一组
for i in range(len(x)):
    x[i] = x[i] + width #横坐标移动
plt.bar(x, num2, width=width, label='b',fc = '#4682B4')#画第二组 
plt.show()

结果如下:
python matplotlib 论文画图代码总结
其中,plt.bar()的 fc=’’ 选项控制颜色,可以在文首链接中*选择。
接下来,还要进行几项工作:

  1. 设置x轴显示被比较对象名称:
y=[]
for i in range(len(x)):
    y.append(x[i] - width/2)   
ax.set_xticks(y) #令对象名称出现在相邻两"柱"中间位置
ax.set_xticklabels(item)
  1. 设置字体
plt.tick_params(labelsize=16)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]#坐标轴字体设置

font1 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 16,
}
plt.legend(prop=font1)#图例字体设置
  1. 画背景线
plt.grid(axis="y")
  1. 添加xlabel,ylabel,title
plt.xlabel('Item',font1)
plt.ylabel('Value',font1)
plt.title('Parallel Histogram',font1)

最终效果如下:
python matplotlib 论文画图代码总结
完整代码如下:

import matplotlib.pyplot as plt
figure, ax = plt.subplots()
item = ['A','B','C']
num1 = [0.5, 0.6, 0.7]
num2 = [0.75, 0.85, 0.95] #这里对数据进行了截断,所有值都减去了2,只画从2开始的部分
x =list(range(len(num1))) #横坐标
width = 0.4 #每一根“柱”的宽度
plt.yticks([0, 0.2, 0.4, 0.6, 0.8, 1.0], [2.0, 2.2, 2.4, 2.6, 2.8, 3.0])
#设置y坐标,实际数值是前一组,标记数值为后一组
plt.bar(x, num1, width=width, label='a',fc = '#B0C4DE')#画第一组
for i in range(len(x)):
    x[i] = x[i] + width #横坐标移动
plt.bar(x, num2, width=width, label='b',fc = '#4682B4')#画第二组 

y=[]
for i in range(len(x)):
    y.append(x[i] - width/2)   
ax.set_xticks(y) #令对象名称出现在相邻两"柱"中间位置
ax.set_xticklabels(item)

plt.tick_params(labelsize=16)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]#坐标轴字体设置

font1 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 16,
}
plt.legend(prop=font1)#图例字体设置

plt.grid(axis="y")
plt.xlabel('Item',font1)
plt.ylabel('Value',font1)
plt.title('Parallel Histogram',font1)
plt.show()

如果空白区域太小,放不下图例,还可以添加如下命令自主调控y轴范围:

plt.ylim(0, 2)

普通柱状图

上一节的简化版,以只画上表第一行为例,直接上代码:

import matplotlib.pyplot as plt
figure, ax = plt.subplots()
item = ['A','B','C']
num1 = [0.5, 0.6, 0.7]

x=[0,0.8,1.6]
plt.yticks([0, 0.2, 0.4, 0.6, 0.8, 1.0], [2.0, 2.2, 2.4, 2.6, 2.8, 3.0])

plt.bar(x, num1,width=0.45,color='#4682B4',label='a',tick_label=item)

plt.tick_params(labelsize=16)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
font1 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 16,
}
plt.legend(prop=font1)
plt.grid(axis="y")
plt.xlabel('Item',font1)
plt.ylabel('Value',font1)
plt.title('Histogram',font1)
plt.show()

python matplotlib 论文画图代码总结
注意可以通过调节横坐标向量x和宽度width对横向间隔进行调节。

堆叠柱状图

关键代码只有这一部分:

plt.bar(x, num1, width=0.45,label='a',fc = '#4682B4')
plt.bar(x, num2, width=0.45, bottom=num1, label='b',tick_label = item,fc = '#B0C4DE')

用相同横坐标,先画a,再使用 bottom 选项,在a上叠加b。
完整代码如下:

import matplotlib.pyplot as plt
figure, ax = plt.subplots()
item = ['A','B','C']
num1 = [2.5, 2.6, 2.7]
num2 = [2.75, 2.85, 2.95]
x=[0,0.8,1.6]

plt.bar(x, num1, width=0.45,label='a',fc = '#4682B4')
plt.bar(x, num2, width=0.45, bottom=num1, label='b',tick_label = item,fc = '#B0C4DE')

plt.tick_params(labelsize=16)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
font1 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 16,
}
plt.legend(prop=font1)
plt.ylim(0,7)

plt.grid(axis="y")
plt.xlabel('Item',font1)
plt.ylabel('Value',font1)
plt.title(' Stacked Histogram',font1)
plt.show()

效果如下:
python matplotlib 论文画图代码总结

折线图

关键代码如下:

plt.plot(x,num1,label='a',linestyle='--',color='r',marker='D')
plt.plot(x,num2,label='b',linestyle='--',color='b',marker='o')

完整代码:

import matplotlib.pyplot as plt
figure, ax = plt.subplots()
item = ['A','B','C']
num1 = [2.5, 2.6, 2.7]
num2 = [2.75, 2.85, 2.95]
x=[1,2,3]

plt.plot(x,num1,label='a',linestyle='--',color='r',marker='D')
plt.plot(x,num2,label='b',linestyle='--',color='b',marker='o')
plt.yticks([2.4,2.6,2.8,3.0])  #设置x,y坐标值
plt.xticks(x)

plt.tick_params(labelsize=16)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
font1 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 16,
}
plt.legend(prop=font1,loc=4)

plt.grid(axis="y")
plt.xlabel('Item',font1)
plt.ylabel('Value',font1)
plt.title('Line Chart',font1)
plt.show()

最终效果:
python matplotlib 论文画图代码总结