matplotlib一维散点分布图的绘制
迪丽瓦拉
2024-05-30 16:28:39
0

引言

本次的目标是绘制数据的一维散点分布图,应用场景是数据一维标签的聚类可视化,假定我们拥有原始的带标签数据(X,y)(X,y)(X,y)其中XXX为样本特征矩阵,yyy为对应样本的标签(连续值),通过聚类算法得到了XXX的伪分类标签y^,y^∈(1,2,...,N)\hat{y}, \hat{y}\in(1,2,...,N)y^​,y^​∈(1,2,...,N),想要绘制出相同类别样本在标签值是否同样是集中的。
值得注意的是,由于我们可能获得多类样本,因此仅仅使用一张图来进行绘制可能会使得不同类别样本的marker在图上相互重叠,因此需要为每一类样本单独绘制一维散点分布图,并在同一张画布上显示。

方法

  为了显示一维的单张散点分布图,我们需要对matplotlib默认的二维画布进行调整,将其余三条轴线都设置为不可见,只保留底部的轴线,进一步的,要把纵轴label的位置向图左端移动(否则在横轴包括负半轴时,label会出现在图中央),实例代码如下:

axs.spines['top'].set_visible(False)
axs.spines['right'].set_visible(False)
axs.spines['left'].set_visible(False)
axs.yaxis.set_ticks_position('left')
axs.set_xlim((-0.05,1.05))
axs.set_ylim((0,1))
axs.set_yticks([0],labels=['score'])

对于多张一维散点图的绘制,只需要利用subplot函数,对子图重复进行上述操作即可。整体代码如下:

def score_distr(group,x_lim=(-0.1,1.1),y_lim=(-0.1,1.1)):'''可视化N个类别中每个样本的y分布:param group: List[np.ndarray], N类样本标签y组成的数组:param x_lim: 横坐标区间:param y_lim: 纵坐标区间:return:'''group_num=len(group)color_map=["violet","tomato","cyan","salmon","limegreen"]fig,axs=plt.subplots(group_num,1)dem_labels=[]for i in range(group_num):axs[i].scatter(group[i],[0.05]*group[i].shape[0],label="class_"+str(i),c=color_map[i])# axs[i].xlim(x_lim)dem_labels.append("class_"+str(i))axs[i].spines['top'].set_visible(False)axs[i].spines['right'].set_visible(False)axs[i].spines['left'].set_visible(False)axs[i].yaxis.set_ticks_position('left')axs[i].set_xlim(x_lim)axs[i].set_ylim(y_lim)axs[i].set_yticks([0],labels=['score'])fig.legend(dem_labels,loc=(0.45,0.85))

测试结果

 给出示例代码及对应结果如下:

test=[]
for i in range(3):test.append(np.random.rand(15))
score_distr(test,x_lim=(-1.05,1.05))

结果:
在这里插入图片描述

参考

可视化: Python—MatPlotLib—一维散点图

相关内容