本文将使用matplotlib.pyplot模块中的scatter函数进行散点图绘制,以下代码块是导入各个需要用到的库,其中make_blobs函数用于生成数据,可以看到我们生成的数据df的前5行
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import make_blobs
import numpy as np
data=make_blobs(n_samples=150,n_features=4,centers=3,random_state=20220203)
df=pd.DataFrame(data[0],columns=['v1','v2','v3','v4'])
df['target']=data[1]
df.head()
v1 | v2 | v3 | v4 | target | |
---|---|---|---|---|---|
0 | 1.046182 | 1.747420 | 1.680394 | 6.627963 | 2 |
1 | 3.654120 | 2.169111 | 1.494711 | 4.880651 | 2 |
2 | 2.227285 | 0.497507 | 2.115962 | 8.216452 | 2 |
3 | 3.995025 | 1.423546 | 0.993872 | 5.559633 | 2 |
4 | 1.994595 | 1.276570 | 0.905848 | 7.997673 | 2 |
首先我们对各个参数进行解释,便于我们对图像进行优化。
plt.scatter()参数:
x,y:输入进行绘制的序列
s:绘制散点的大小:可以使标量,也可以是向量
c:颜色序列或者单一颜色:
1是一个标量或者是和x同样长度的序列,用于将以下cmap或者norm参数转化为颜色 2是一个2D的RGB或者RGBA的数组 3是一个和输入x同样长度的颜色序列 4是一个用于设定颜色的字符串
marker:散点的形状,默认为“o”
cmap:特定色谱名称字符串或者色谱元素,当且仅当c是一列浮点数的时候使用
norm:用于将输入的c的浮点数类型的序列进行标准化,如果不加,则表示使用默认的标准化方式
vmin, vmax:浮点数,当不添加norm参数的时候使用用于进行标准化颜色向量。
alpha:颜色透明度
linewidths:散点边界宽度,浮点型或者向量。
edgecolors:点的边界颜色,默认为点的内部颜色,也可以是NONE,或者一个序列。
1.1初级绘制
首先是对数
plt.scatter(x=df['v1'],y=df['v2'])
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.1 标量设置点大小
将s设置为标量,可以让所有的点都同样的大小。
plt.scatter(x=df['v1'],y=df['v2'],s=100)
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.2向量设置点的大小
使用向量设置点的大小,可以反应三个维度的信息:横轴、纵轴、点尺寸。
plt.scatter(x=df['v1'],y=df['v2'],s=df['target']*100+50)
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.3设置点的形状
首先我们选择了常见的几种点型,并绘图如下:
markers=['.',',','o','v','^','<','>','1','8','s','p',
'P','*','H','h','+','x','X','D','d']#常用的散点的形状
fig,axs=plt.subplots(4,5,figsize=(25,20))
for j in range(4):
for i in range(1,6):
axs[j][i-1].scatter(1,1,marker=markers[i-1+j*5],s=1000)
axs[j][i-1].text(x=1.01,y=1.01,s=str(markers[i-1+j*5]))
这里是只用本文数据的一个更换点型的例子
plt.scatter(x=df['v1'],y=df['v2'],s=100,marker='*')
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.4以标量形式改换颜色
通过c='red'我们将散点设置为红色
plt.scatter(x=df['v1'],y=df['v2'],s=100,c='red')
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.5设置透明度
alpha=0.5设置透明度,可以看出,设置透明度之后更方便看出数据的重叠情况
plt.scatter(x=df['v1'],y=df['v2'],s=100,c='red',alpha=0.4)
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.6添加边沿颜色
此处添加边缘颜色,我仅仅是为了好看
plt.scatter(x=df['v1'],y=df['v2'],c='red',s=100,alpha=0.6,edgecolor='black')
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.1.7设置边缘宽度
也是为了好看
plt.scatter(x=df['v1'],y=df['v2'],c='red',s=100,alpha=0.6,linewidths=2,edgecolor='black')
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.2进阶绘制
1.2.1使用色谱向量表示分类
plt.scatter(x=df['v1'],y=df['v2'],c=df['target'],s=100,alpha=0.6,
linewidths=2,edgecolor='black',cmap='Set1')
plt.colorbar()
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.2.2使用连续颜色向量
plt.scatter(x=df['v1'],y=df['v2'],c=df['v4'],s=100,alpha=0.7,
linewidths=2,edgecolor='black',cmap='Set1',vmin=min(df['v4']),vmax=max(df['v4']))
plt.colorbar()
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
plt.scatter(x=df['v1'],y=df['v2'],c=df['v4'],s=100,alpha=0.7,
linewidths=2,edgecolor='black',cmap='hsv',vmin=min(df['v4']),vmax=max(df['v4']))
plt.xlabel('v1')
plt.ylabel('v2')
plt.colorbar()
plt.show()
1.2.3气泡图
plt.scatter(x=df['v1'],y=df['v2'],c=df['target'],s=abs(df['v4'])*80,alpha=0.6,
linewidths=2,edgecolor='black',cmap='Set1')
plt.xlabel('v1')
plt.ylabel('v2')
plt.show()
1.2.3加图例和标签方式1
import matplotlib.patches as mpatches
plt.rcParams['font.sans-serif'] = ['fangsong'] # 步骤一(替换sans-serif字体)
plt.rcParams['font.size'] = 12 #设置字体大小
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
plt.rcParams["axes.facecolor"]="cornsilk"
plt.figure(figsize=(10,6))
plt.scatter(x=df['v1'],y=df['v2'],c=df['target'],s=abs(df['v4'])*80,alpha=0.6,
linewidths=2,edgecolor='black',cmap='Set1')
plt.xlabel('横向')
plt.ylabel('纵向')
plt.title('虚构数据的气泡图')
cmap1=plt.get_cmap('Set1')
colors=cmap1(np.arange(0,9,4))
labels=[mpatches.Patch(color=colors[i],label=i)for i in range(len(colors))]
plt.legend(handles=labels,loc='lower right')
plt.grid()
plt.show()
1.2.4方式2
plt.figure(figsize=(10,6))
colors=['red','green','blue']
for class1 in df['target'].value_counts().index:
x=df[df['target']==class1]['v1']
y=df[df['target']==class1]['v2']
plt.scatter(x,y,c=colors[class1],s=100,alpha=0.6,
linewidths=2,edgecolor='black',label=class1)
plt.grid()
plt.xlabel('横向')
plt.ylabel('纵向')
plt.title('虚构数据的气泡图')
plt.legend()
plt.show()