当前位置: 代码迷 >> 综合 >> python绘制散点图-同一图像绘制多散点图-plt.scatter()函数
  详细解决方案

python绘制散点图-同一图像绘制多散点图-plt.scatter()函数

热度:30   发布时间:2023-12-03 01:04:17.0

绘制散点图

这里绘制散点图的数据来源为我研究项目的缺陷统计文档,文档格式为.txt格式,数据形式如图1所示,其中,每一行的第一个元素为类别信息,第二个元素为面积信息,第三个元素为标注框的高H,第四个元素为标注框的宽W.
这里绘制的散点图为每一类缺陷的长宽比,假设swelling有100个,则绘制图像的横坐标最大值为100,即横坐标表示的是某一类的数量信息.纵坐标为缺陷的长宽比.

图1 绘制散点图的数据格式截图

对绘制散点图的数据来源有一定了解之后,我们直接编写代码,绘制图像.

from pylab import *
import numpy as np
import pandas as pd
from PIL import Image#需要修改读取文件的名字和保存文件的名字
#读取存储数据的.txt文档,文档数据格式为:
filename = r'C:\Users\14188\Desktop\1123\数据集分析\面积\analysis_result.txt'Area,X_dis,Y_dis=[],[],[]
bulge_arr,pit_arr,scratch_arr,hole_arr,wrinkle_arr,crackle_arr,scar_arr,swelling_arr=[],[],[],[],[],[],[],[]
#读取excel文档数据,这里读取的是txt数据.
# loandata=pd.DataFrame(pd.read_excel('loan_data.xlsx'))
classes = ["bulge", "pit", "scratch", "hole", "wrinkle", "crackle", "scar", "swelling"]
#新建列表,分别用于存放不同了类别缺陷的长宽比,这个长宽比最终表现为散点图的纵坐标.
bulge_wh,pit_wh,scratch_wh,hole_wh,wrinkle_wh,crackle_wh,scar_wh,swelling_wh=[],[],[],[],[],[],[],[]
#打开txt文档
with open(filename, 'r') as f:# 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。然后将每个元素中的不同信息提取出来lines = f.readlines()# i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要# j用于判断读了多少条,step为画图的X轴k=j = 0#类别_nume用来统计每一类缺陷的数量,即每类缺陷一共有多少个.类别_area用于求每一类缺陷的面积总和,这里绘制散点图是用不到这个变量.bulge_area, bulge_nume, pit_area, pit_nume, scratch_area, scratch_nume, hole_area, hole_nume = 0, 0, 0, 0, 0, 0, 0, 0wrinkle_nume, wrinkle_area, crackle_area, crackle_nume, scar_area, scar_nume, swelling_area, swelling_nume = 0, 0, 0, 0, 0, 0, 0, 0
#读取文档的每一行。for line in lines:j = j + 1# #从图1可以看出,数据集中存在没有数据的空行,所以这里使用判断语句,跳过这些空行.if line!='\n':#使用','分隔符分割每一行,分割后每一行为含有四个元素的列表.num = line.split(',')print("**num[0]**", num[0])#如果为非空行,则判断该行第一个元素是否等于'bulge',如果等于,则该类别缺陷的数量加1,同时,将该类别缺陷的长宽比添加到bulge_wh列表中.if num[0]=='bulge':print("**num[0]**",num[0])bulge_arr.append(int(num[1]))bulge_area=int(num[1])+bulge_areabulge_nume=bulge_nume+1bulge_wh.append(int(num[2])/int(num[3]))if num[0]=='pit':pit_arr.append(int(num[1]))pit_area=int(num[1])+ pit_areapit_nume= pit_nume+1pit_wh.append(int(num[2]) / int(num[3]))if num[0] == 'scratch':scratch_arr.append(int(num[1]))scratch_area = int(num[1]) + scratch_areascratch_nume = scratch_nume + 1scratch_wh.append(int(num[2]) / int(num[3]))if num[0] == 'hole':hole_arr.append(int(num[1]))hole_area = int(num[1]) + hole_areahole_nume = hole_nume + 1hole_wh.append(int(num[2]) / int(num[3]))if num[0] == 'wrinkle':wrinkle_arr.append(int(num[1]))wrinkle_area =int(num[1]) + wrinkle_areawrinkle_nume = wrinkle_nume + 1wrinkle_wh.append(int(num[2]) / int(num[3]))if num[0] == 'crackle':crackle_arr.append(int(num[1]))crackle_area = int(num[1]) + crackle_areacrackle_nume = crackle_nume + 1crackle_wh.append(int(num[2]) / int(num[3]))if num[0] == 'scar':scar_arr.append(int(num[1]))scar_area = int(num[1])+ scar_areascar_nume = scar_nume + 1scar_wh.append(int(num[2]) / int(num[3]))if num[0] == 'swelling':swelling_arr.append(int(num[1]))swelling_area = int(num[1]) + swelling_areaswelling_nume = swelling_nume + 1swelling_wh.append(int(num[2]) / int(num[3]))#以下用于统计其他信息,可以直接跳转到创建一个8*6点的图N=int(len(num)/4)for i in range(0,N):k=k+1area=num[i*4+1]Area.append(int(area))x_dis=num[i*4+2]y_dis=int(num[i*4+3])X_dis.append(int(x_dis))Y_dis.append(float(y_dis))
print('j:',j)
print(bulge_area)
print(bulge_nume)
#显示每一类缺陷的平均面积,缺陷数目、平均面积、每一类的最大面积、最小面积
print('总面积,缺陷数目、平均面积、每一类的最大面积、最小面积')
print('bulge_area,bulge_nume,bulge_average_area',bulge_area,bulge_nume,bulge_area/bulge_nume,max(np.array(bulge_arr)),min(np.array(bulge_arr)))
print('pit_area,pit_nume,pit_average_area',pit_area,pit_nume,pit_area/pit_nume,max(np.array(pit_arr)),min(np.array(pit_arr)))
print('scratch_area,scratch_nume,scratch_average_area',scratch_area,scratch_nume,scratch_area/scratch_nume,max(np.array(scratch_arr)),min(np.array(scratch_arr)))
print('hole_area,hole_nume,hole_average_area',hole_area,hole_nume,hole_area/hole_nume,max(np.array(hole_arr)),min(np.array(hole_arr)))
print('wrinkle_area,wrinkle_nume,wrinkle_average_area',wrinkle_area,wrinkle_nume,wrinkle_area/wrinkle_nume,max(np.array(wrinkle_arr)),min(np.array(wrinkle_arr)))
print('crackle_area,crackle_nume,crackle_average_area',crackle_area,crackle_nume,crackle_area/crackle_nume,max(np.array(crackle_arr)),min(np.array(crackle_arr)))
print('scar_area,scar_nume,scar_average_area',scar_area,scar_nume,scar_area/scar_nume,max(np.array(scar_arr)),min(np.array(scar_arr)))
print('swelling_area,swelling_nume,swelling_average_area',swelling_area,swelling_nume,swelling_area/swelling_nume,max(np.array(swelling_arr)),min(np.array(swelling_arr)))
#统计每个类别的平均面积
print(len(Area))
print(len(X_dis))
print(len(Y_dis))
i=0
for ar in Area:if ar>78643:i+=1
print('小于面积10%的数目ar',i)x=0
for x_dis in X_dis:if x_dis>102:x+=1
print('小于x方向尺寸10%的数目',x)y = 0
for y_dis in Y_dis:if y_dis<77:y+=1
print('小于y方向尺寸10%的数目',y)#以上为获取散点图的横坐标数据:类别_nume,纵坐标数据:类别_wh.下面开始根据横纵坐标绘制图像.
# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
#考虑到一共要绘制8类目标的散点图,因此将图像尺寸扩大为24*18
figure(figsize=(24,18), dpi=80)# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
#将子图给变量ax的目的是为了后面通过ax控制子图。
ax=subplot(1,1,1)
print(bulge_nume,len(bulge_wh) )
#连续曲线用plt.plot,绘制散点图用plt.scatter()
#s1表示散点的大小,color表示散点的颜色,marker表示散点的标记方式,alpha表示散点的透明度,label表示这类散点的标签.
s1 = np.pi * 2**2
A=plt.scatter(list(range(bulge_nume)), bulge_wh, s=s1,color='g',marker='.', alpha=0.4,label='bulge')
B =plt.scatter(list(range(pit_nume)), pit_wh, s1, 'g',marker='.',alpha=0.4, label='pit')
C =plt.scatter(list(range(scratch_nume)), scratch_wh,s1, 'r',marker='.',alpha=0.4, label='scratch')
D =plt.scatter(list(range(hole_nume)), hole_wh,s1, 'c',marker='.',alpha=0.4, label='hole')
E =plt.scatter(list(range(wrinkle_nume)), wrinkle_wh,s1, 'm',marker='.',alpha=0.4, label='wrinkle')
F =plt.scatter(list(range(crackle_nume)), crackle_wh,s1, 'y',marker='.',alpha=0.4, label='crackle')
G =plt.scatter(list(range(scar_nume)), scar_wh,s1, 'k',marker='.',alpha=0.4, label='scar')
H =plt.scatter(list(range(swelling_nume)), swelling_wh,s1, 'w',marker='.',alpha=0.4, label='swelling')#设置图例并且设置图例的字体及大小font1 = {
    'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 23,
}
legend = plt.legend(handles=[A,B,C,D,E,F,G,H],prop=font1)
#设置坐标刻度值的大小以及刻度值的字体
plt.tick_params(labelsize=23)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
#设置横纵坐标的名称以及对应字体格式
font2 = {
    'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 20,
}
plt.xlabel('number',font2)
plt.ylabel("W/H",font2)
plt.show()
# # 以分辨率 72 来保存图片plt.savefig(r'C:\Users\14188\Desktop\1123\绘制loss曲线\loss图像'+'/'+"8.png",dpi=600)

结果如下图所示:
在这里插入图片描述

绘制曲线图

这里绘制散点图的数据来源为我研究项目的缺陷统计文档,文档格式为.txt格式,数据形式如图2所示,其中,每一行的第一个元素为类别信息,第二个元素为面积信息,第三个元素为标注框的高H,第四个元素为标注框的宽W.
这里绘制的散点图为每一类缺陷的长宽比,假设swelling有100个,则绘制图像的横坐标最大值为100,即横坐标表示的是某一类的数量信息.纵坐标为缺陷的长宽比.

图2 绘制曲线图的数据格式截图

对绘制曲线图的数据来源有一定了解之后,我们直接编写代码,绘制图像.

from pylab import *
import numpy as np
import pandas as pd
from PIL import Image#需要修改读取文件的名字和保存文件的名字
#读取存储数据的.txt文档,文档数据格式为:
filename = r'C:\Users\14188\Desktop\1123\数据集分析\面积\analysis_result.txt'Area,X_dis,Y_dis=[],[],[]
bulge_arr,pit_arr,scratch_arr,hole_arr,wrinkle_arr,crackle_arr,scar_arr,swelling_arr=[],[],[],[],[],[],[],[]
#读取excel文档数据,这里读取的是txt数据.
# loandata=pd.DataFrame(pd.read_excel('loan_data.xlsx'))
classes = ["bulge", "pit", "scratch", "hole", "wrinkle", "crackle", "scar", "swelling"]
#新建列表,分别用于存放不同了类别缺陷的长宽比,这个长宽比最终表现为散点图的纵坐标.
bulge_wh,pit_wh,scratch_wh,hole_wh,wrinkle_wh,crackle_wh,scar_wh,swelling_wh=[],[],[],[],[],[],[],[]
#打开txt文档
with open(filename, 'r') as f:# 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。然后将每个元素中的不同信息提取出来lines = f.readlines()# i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要# j用于判断读了多少条,step为画图的X轴k=j = 0#类别_nume用来统计每一类缺陷的数量,即每类缺陷一共有多少个.类别_area用于求每一类缺陷的面积总和,这里绘制散点图是用不到这个变量.bulge_area, bulge_nume, pit_area, pit_nume, scratch_area, scratch_nume, hole_area, hole_nume = 0, 0, 0, 0, 0, 0, 0, 0wrinkle_nume, wrinkle_area, crackle_area, crackle_nume, scar_area, scar_nume, swelling_area, swelling_nume = 0, 0, 0, 0, 0, 0, 0, 0
#读取文档的每一行。for line in lines:j = j + 1# #从图1可以看出,数据集中存在没有数据的空行,所以这里使用判断语句,跳过这些空行.if line!='\n':#使用','分隔符分割每一行,分割后每一行为含有四个元素的列表.num = line.split(',')print("**num[0]**", num[0])#如果为非空行,则判断该行第一个元素是否等于'bulge',如果等于,则该类别缺陷的数量加1,同时,将该类别缺陷的长宽比添加到bulge_wh列表中.if num[0]=='bulge':print("**num[0]**",num[0])bulge_arr.append(int(num[1]))bulge_area=int(num[1])+bulge_areabulge_nume=bulge_nume+1bulge_wh.append(int(num[2])/int(num[3]))if num[0]=='pit':pit_arr.append(int(num[1]))pit_area=int(num[1])+ pit_areapit_nume= pit_nume+1pit_wh.append(int(num[2]) / int(num[3]))if num[0] == 'scratch':scratch_arr.append(int(num[1]))scratch_area = int(num[1]) + scratch_areascratch_nume = scratch_nume + 1scratch_wh.append(int(num[2]) / int(num[3]))if num[0] == 'hole':hole_arr.append(int(num[1]))hole_area = int(num[1]) + hole_areahole_nume = hole_nume + 1hole_wh.append(int(num[2]) / int(num[3]))if num[0] == 'wrinkle':wrinkle_arr.append(int(num[1]))wrinkle_area =int(num[1]) + wrinkle_areawrinkle_nume = wrinkle_nume + 1wrinkle_wh.append(int(num[2]) / int(num[3]))if num[0] == 'crackle':crackle_arr.append(int(num[1]))crackle_area = int(num[1]) + crackle_areacrackle_nume = crackle_nume + 1crackle_wh.append(int(num[2]) / int(num[3]))if num[0] == 'scar':scar_arr.append(int(num[1]))scar_area = int(num[1])+ scar_areascar_nume = scar_nume + 1scar_wh.append(int(num[2]) / int(num[3]))if num[0] == 'swelling':swelling_arr.append(int(num[1]))swelling_area = int(num[1]) + swelling_areaswelling_nume = swelling_nume + 1swelling_wh.append(int(num[2]) / int(num[3]))#以下用于统计其他信息,可以直接跳转到创建一个8*6点的图N=int(len(num)/4)for i in range(0,N):k=k+1area=num[i*4+1]Area.append(int(area))x_dis=num[i*4+2]y_dis=int(num[i*4+3])X_dis.append(int(x_dis))Y_dis.append(float(y_dis))
print('j:',j)
print(bulge_area)
print(bulge_nume)
#显示每一类缺陷的平均面积,缺陷数目、平均面积、每一类的最大面积、最小面积
print('总面积,缺陷数目、平均面积、每一类的最大面积、最小面积')
print('bulge_area,bulge_nume,bulge_average_area',bulge_area,bulge_nume,bulge_area/bulge_nume,max(np.array(bulge_arr)),min(np.array(bulge_arr)))
print('pit_area,pit_nume,pit_average_area',pit_area,pit_nume,pit_area/pit_nume,max(np.array(pit_arr)),min(np.array(pit_arr)))
print('scratch_area,scratch_nume,scratch_average_area',scratch_area,scratch_nume,scratch_area/scratch_nume,max(np.array(scratch_arr)),min(np.array(scratch_arr)))
print('hole_area,hole_nume,hole_average_area',hole_area,hole_nume,hole_area/hole_nume,max(np.array(hole_arr)),min(np.array(hole_arr)))
print('wrinkle_area,wrinkle_nume,wrinkle_average_area',wrinkle_area,wrinkle_nume,wrinkle_area/wrinkle_nume,max(np.array(wrinkle_arr)),min(np.array(wrinkle_arr)))
print('crackle_area,crackle_nume,crackle_average_area',crackle_area,crackle_nume,crackle_area/crackle_nume,max(np.array(crackle_arr)),min(np.array(crackle_arr)))
print('scar_area,scar_nume,scar_average_area',scar_area,scar_nume,scar_area/scar_nume,max(np.array(scar_arr)),min(np.array(scar_arr)))
print('swelling_area,swelling_nume,swelling_average_area',swelling_area,swelling_nume,swelling_area/swelling_nume,max(np.array(swelling_arr)),min(np.array(swelling_arr)))
#统计每个类别的平均面积
print(len(Area))
print(len(X_dis))
print(len(Y_dis))
i=0
for ar in Area:if ar>78643:i+=1
print('小于面积10%的数目ar',i)x=0
for x_dis in X_dis:if x_dis>102:x+=1
print('小于x方向尺寸10%的数目',x)y = 0
for y_dis in Y_dis:if y_dis<77:y+=1
print('小于y方向尺寸10%的数目',y)#以上为获取散点图的横坐标数据:类别_nume,纵坐标数据:类别_wh.下面开始根据横纵坐标绘制图像.
# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
#考虑到一共要绘制8类目标的散点图,因此将图像尺寸扩大为24*18
figure(figsize=(24,18), dpi=80)# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
#将子图给变量ax的目的是为了后面通过ax控制子图。
ax=subplot(1,1,1)
print(bulge_nume,len(bulge_wh) )
#连续曲线用plt.plot,绘制散点图用plt.scatter()
#s1表示散点的大小,color表示散点的颜色,marker表示散点的标记方式,alpha表示散点的透明度,label表示这类散点的标签.
s1 = np.pi * 2**2
A=plt.plot(list(range(bulge_nume)), bulge_wh, color='g',label='bulge')
B =plt.plot(list(range(pit_nume)), pit_wh, 'g',alpha=0.4, label='pit')
C =plt.plot(list(range(scratch_nume)), scratch_wh,'r',label='scratch')
D =plt.plot(list(range(hole_nume)), hole_wh,'c', label='hole')
E =plt.plot(list(range(wrinkle_nume)), wrinkle_wh,'m', label='wrinkle')
F =plt.plot(list(range(crackle_nume)), crackle_wh,'y', label='crackle')
G =plt.plot(list(range(scar_nume)), scar_wh, 'k',label='scar')
H =plt.plot(list(range(swelling_nume)), swelling_wh,'w',label='swelling')
#设置图例并且设置图例的字体及大小font1 = {
    'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 23,
}
legend = plt.legend(handles=[A,B,C,D,E,F,G,H],prop=font1)
#设置坐标刻度值的大小以及刻度值的字体
plt.tick_params(labelsize=23)
labels = ax.get_xticklabels() + ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
#设置横纵坐标的名称以及对应字体格式
font2 = {
    'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 20,
}
plt.xlabel('number',font2)
plt.ylabel("W/H",font2)
plt.show()
# # 以分辨率 72 来保存图片plt.savefig(r'C:\Users\14188\Desktop\1123\绘制loss曲线\loss图像'+'/'+"8.png",dpi=600)

结果如下如;
在这里插入图片描述