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

绘制散点图

这里绘制散点图的数据来源为我研究项目的缺陷统计文档,文档格式为.txt格式,数据形式如图1所示,其中,每一行的第一个元素为类别信息,第二个元素为面积信息,第三个元素为标注框的高H,第四个元素为标注框的宽W.
这里绘制的散点图为每一类缺陷的长宽比,假设swelling有100个,则绘制图像的横坐标最大值为100,即横坐标表示的是某一类的数量信息.纵坐标为缺陷的长宽比.
python绘制散点图-同一图像绘制多散点图-plt.scatter()函数_第1张图片
图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, 0
    wrinkle_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_area
                bulge_nume=bulge_nume+1
                bulge_wh.append(int(num[2])/int(num[3]))
            if num[0]=='pit':
                pit_arr.append(int(num[1]))
                pit_area=int(num[1])+ pit_area
                pit_nume= pit_nume+1
                pit_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'scratch':
                scratch_arr.append(int(num[1]))
                scratch_area = int(num[1]) + scratch_area
                scratch_nume = scratch_nume + 1
                scratch_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'hole':
                hole_arr.append(int(num[1]))
                hole_area = int(num[1]) + hole_area
                hole_nume = hole_nume + 1
                hole_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'wrinkle':
                wrinkle_arr.append(int(num[1]))
                wrinkle_area =int(num[1]) + wrinkle_area
                wrinkle_nume = wrinkle_nume + 1
                wrinkle_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'crackle':
                crackle_arr.append(int(num[1]))
                crackle_area = int(num[1]) + crackle_area
                crackle_nume = crackle_nume + 1
                crackle_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'scar':
                scar_arr.append(int(num[1]))
                scar_area = int(num[1])+ scar_area
                scar_nume = scar_nume + 1
                scar_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'swelling':
                swelling_arr.append(int(num[1]))
                swelling_area = int(num[1]) + swelling_area
                swelling_nume = swelling_nume + 1
                swelling_wh.append(int(num[2]) / int(num[3]))
            #以下用于统计其他信息,可以直接跳转到创建一个8*6点的图
            N=int(len(num)/4)
            for i in range(0,N):
                k=k+1
                area=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)

结果如下图所示:
python绘制散点图-同一图像绘制多散点图-plt.scatter()函数_第2张图片

绘制曲线图

这里绘制散点图的数据来源为我研究项目的缺陷统计文档,文档格式为.txt格式,数据形式如图2所示,其中,每一行的第一个元素为类别信息,第二个元素为面积信息,第三个元素为标注框的高H,第四个元素为标注框的宽W.
这里绘制的散点图为每一类缺陷的长宽比,假设swelling有100个,则绘制图像的横坐标最大值为100,即横坐标表示的是某一类的数量信息.纵坐标为缺陷的长宽比.
python绘制散点图-同一图像绘制多散点图-plt.scatter()函数_第3张图片
图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, 0
    wrinkle_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_area
                bulge_nume=bulge_nume+1
                bulge_wh.append(int(num[2])/int(num[3]))
            if num[0]=='pit':
                pit_arr.append(int(num[1]))
                pit_area=int(num[1])+ pit_area
                pit_nume= pit_nume+1
                pit_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'scratch':
                scratch_arr.append(int(num[1]))
                scratch_area = int(num[1]) + scratch_area
                scratch_nume = scratch_nume + 1
                scratch_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'hole':
                hole_arr.append(int(num[1]))
                hole_area = int(num[1]) + hole_area
                hole_nume = hole_nume + 1
                hole_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'wrinkle':
                wrinkle_arr.append(int(num[1]))
                wrinkle_area =int(num[1]) + wrinkle_area
                wrinkle_nume = wrinkle_nume + 1
                wrinkle_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'crackle':
                crackle_arr.append(int(num[1]))
                crackle_area = int(num[1]) + crackle_area
                crackle_nume = crackle_nume + 1
                crackle_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'scar':
                scar_arr.append(int(num[1]))
                scar_area = int(num[1])+ scar_area
                scar_nume = scar_nume + 1
                scar_wh.append(int(num[2]) / int(num[3]))
            if num[0] == 'swelling':
                swelling_arr.append(int(num[1]))
                swelling_area = int(num[1]) + swelling_area
                swelling_nume = swelling_nume + 1
                swelling_wh.append(int(num[2]) / int(num[3]))
            #以下用于统计其他信息,可以直接跳转到创建一个8*6点的图
            N=int(len(num)/4)
            for i in range(0,N):
                k=k+1
                area=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)

结果如下如;
python绘制散点图-同一图像绘制多散点图-plt.scatter()函数_第4张图片

你可能感兴趣的:(python绘图,python,plot)