目录
1.隔段的bar绘图
2.显示中文字符的曲线绘制
3.需要注意的内容
4.Matplotlib.pyplot之网格线设置
5.绘制散点分布图
6.调整图像和坐标轴大小与位置
7.barh绘制横状图
8.给坐标系添加自定义背景
matplotlib是一个用于创建出版质量图表的桌面绘图包(主要是2D方面),是 Python 的绘图库。一款强大的绘图功能,使得能够制作各种花式的图和表。
本文以8个案例,简要呈现效果的方式,介绍如何对数据进行操作,进而绘制出更加丰富多彩,易看易用的统计图来。
后面的学习中,将以图示和代码为主,相信看到展示出来的结果图,比任何一种语言描述,都更能打动你。如果你觉得对你有帮助,麻烦点赞、评论加关注,我们持续更新学习。
1.隔段的bar绘图
# E-mail:1763469890@qq.com
# 微信公众号:CV初学者
import os
from matplotlib import pyplot as plt
def num_count(input_path):
body_name=['abdomen','chest','hand','knee','foot','pelvis','shoulder']
body_num=[249,1542,704,527,761,247,176]
bar_width = 0.3
valid_num=[49,162,138,100,150,67,54]
fig = plt.figure(figsize=(8, 4))
plt.title("classes_CountNumber")
plt.xlabel("classes")
plt.ylabel("count_number")
plt.bar(body_name, body_num,width=0.5, label="train",align='center')
plt.bar(body_name , valid_num, width=0.5, label="valid", align="center")
# 添加数据标签
for a, b in zip(body_name, body_num):
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)
for a, b in zip(body_name, valid_num):
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)
# 添加图例
plt.legend()
plt.savefig("class_number.png")
plt.show()
if __name__ == "__main__":
input_path = r"F:\image_gen/"
num_count(input_path)
结果展示:
2.显示中文字符的曲线绘制
# E-mail:1763469890@qq.com
# 微信公众号:CV初学者
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False
x1=range(1,9)
y1=[0.3, 1, 0.1, 1.3, 3, 1, 0.4, 2.5]
x2=range(1,9)
y2=[10.25, 0.1, 1.86, 4.7, 1, 3.2, 4.67, 3]
x3=range(1,9)
y3=[0.36, 3.35, 3.24, 3.27, 0.93, 0.5, 5.33, 0.23]
#plt.plot(x1,y1,label='x truth line',linewidth=3,color='r',marker='o', markerfacecolor='blue',markersize=12)
plt.plot(x1,y1,label='y P4P 误差曲线')
plt.plot(x2,y2,label='y DL 3 误差曲线')
plt.plot(x3,y3,label='y DL 4 误差曲线')
plt.xlabel('序号',fontsize=15)
plt.ylabel('y 误差值',fontsize=15)
plt.title('y 误差值对比',fontsize=15)
plt.legend()
plt.show()
结果展示:
技能添加:python画图x轴文字斜着:
plt.xticks(rotation=70) # 倾斜70度
结果展示:
参考:https://blog.csdn.net/Caiqiudan/article/details/107876499
3.需要注意的内容
注意新绘制图的时候,加上plt.figure(),否则会出现如下的错误
加上plt.figure()之后,完整代码如下(两个图在一起的,前面有,就不赘述了,相信你明白)
def draw_png(list_x,list_y,name):
plt.figure()
plt.plot(list_x, list_y, label=name)
plt.xlabel("epoch")
plt.ylabel(name)
# plt.title("ROC")
plt.legend(loc="upper right")
plt.savefig(r"./records/" + name + ".png")
结果就正常了,如下
下面是完整代码:
import numpy as np
import matplotlib.pyplot as plt
doctor_means = (0.914,0.86,0.832,0.884,0.886,0.953)
ai_means = (0.924,0.884,0.908,0.93,0.935,0.953)
ind = np.arange(len(doctor_means)) # the x locations for the groups
width = 0.15 # the width of the bars
fig, ax = plt.subplots(figsize=(10, 8))
rects1 = ax.bar(ind - width / 2, doctor_means, width, color='SkyBlue', label='doctor')
rects2 = ax.bar(ind + width / 2, ai_means, width, color='IndianRed', label='doctor+AI')
# 为每个条形图添加数值标签
for x1,y1 in enumerate(doctor_means):
plt.text(x1-0.1, y1, y1,ha='center',fontsize=10)
for x2,y2 in enumerate(ai_means):
plt.text(x2+0.1, y2, y2,ha='center',fontsize=10)
# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_xlabel('evaluation_idex')
ax.set_title('Radiologists vs Radiologists+AI')
plt.xticks(ind, ('A_Accuracy','A_Sensitivity','B_Accuracy', 'B_Sensitivity','C_Accuracy', 'C_Sensitivity'))
ax.legend()
#plt.xticks(rotation=20)
ax.autoscale(tight=True)
plt.ylim(0, 1.05)
plt.show()
4.Python绘图库Matplotlib.pyplot之网格线设置(plt.grid())
# E-mail:1763469890@qq.com
# 微信公众号:CV初学者
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei', 'Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False
x1 = range(1, 9)
y1 = [0.3, 1, 0.1, 1.3, 3, 1, 0.4, 2.5]
x2 = range(1, 9)
y2 = [10.25, 0.1, 1.86, 4.7, 1, 3.2, 4.67, 3]
x3 = range(1, 9)
y3 = [0.36, 3.35, 3.24, 3.27, 0.93, 0.5, 5.33, 0.23]
# plt.plot(x1,y1,label='x truth line',linewidth=3,color='r',marker='o', markerfacecolor='blue',markersize=12)
plt.plot(x1, y1, label='y P4P 误差曲线')
plt.plot(x2, y2, label='y DL 3 误差曲线')
plt.plot(x3, y3, label='y DL 4 误差曲线')
plt.xlabel('序号', fontsize=15)
plt.ylabel('y 误差值', fontsize=15)
plt.title('y 误差值对比', fontsize=15)
plt.legend()
#################################
plt.grid(linestyle='-.')
#################################
plt.show()
结果展示:
参考文章:https://blog.csdn.net/weixin_41789707/article/details/81035997
5.绘制散点分布图
# 绘制散点图
import numpy as np
import matplotlib.pyplot as plt
import csv
list_score = []
csvfile = r'F:\stage2_DR_TB\778_class_score.csv'
with open(csvfile, 'r', encoding='gbk') as f:
# TODO
# 使用csv.DictReader读取文件中的信息
reader = csv.DictReader(f)
for rows in reader:
classes = rows['class']
score = rows['score']
print(classes, score)
if classes == "0":
list_score.append(round(float(score), 2))
x=[]
for i in range(len(list_score)):
x.append(i)
y = list_score
print(x)
print(y)
plt.figure(figsize=(8, 5))
plt.ylim(0, 1)
plt.scatter(x, y)
plt.title("778TN train twoClass"+str(arr_mean)+"±"+str(arr_std))
# 添加图例
plt.legend()
plt.grid(linestyle='-.')
plt.show()
6.调整图像和坐标轴大小与位置
fig = plt.figure(figsize=(16, 9))
fig.subplots_adjust(left=0.05, right=0.95, bottom=0.25, top=0.95, wspace=0.05, hspace=0.05)
plt.bar(x_list, y_list, width=0.5, label="label", align='center')
for a, b in zip(x_list, y_list):
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)
print(len(x_list))
print(x_list)
plt.xlabel('class', fontsize=15)
plt.xticks(rotation=90) # 倾斜70度
plt.title('lesion num', fontsize=15)
plt.legend()
plt.grid(linestyle='-.')
#plt.savefig("loss.png")
plt.show()
结果展示:
7.barh绘制横状图
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4))
x_list=['beijing','nanjing','guangzhou','shenzhen','shanghai','hefei']
y1_list=[15,23,60,32,5,6]
y2_list=[12,20,30,16,2,3]
plt.barh(x_list, y1_list, label='predict',height=0.9)
plt.barh(x_list, y2_list, label='accurate',height=0.9)
plt.legend()
plt.title("barh")
plt.show()
结果展示:
8.给坐标系添加“自定义背景”
import matplotlib.pyplot as plt
img = plt.imread(r"E:\temp\image\image.jpg")
fig, ax = plt.subplots()
ax.imshow(img, extent=[1, 80, 1, 60])
x_list=[10,20,30,40,50,60]
y1_list=[15,23,60,32,5,6]
y2_list=[12,20,30,16,2,3]
plt.barh(x_list, y1_list, label='predict',height=3.9)
plt.barh(x_list, y2_list, label='accurate',height=3.9)
plt.legend()
plt.title("image_plot")
plt.show()
结果展示:
最后,喜欢就给个大大的赞吧。小白回归,希望继续和大家一起学习,这段时间积攒了很多知识总结,容我娓娓道来。加油!!!
往期回顾