如何创建每个点有两种颜色的散点图? [英] How to create a scatter plot with two colors per dot?

查看:112
本文介绍了如何创建每个点有两种颜色的散点图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 matplotlib 中同时绘制 ground-truthmy 分类.

目前,在特征空间上应用 tsne 并使用以下代码添加边缘后,我只绘制了真实情况

from matplotlib.collections import LineCollectioncols=['rgbkm'[lbl] for lbl in list(data.y.cpu().numpy() - 1)]lc = LineCollection(X_embedded[out_dict['edges']],linewidth=0.05)fig = plt.figure()plt.gca().add_collection(lc)plt.xlim(X_embedded[:,0].min(), X_embedded[:,0].max())plt.ylim(X_embedded[:,1].min(), X_embedded[:,1].max())plt.scatter(X_embedded[:,0],X_embedded[:,1], c=cols)

这给出了以下情节:

同时,我希望以某种方式为每个顶点着色:

解决方案

这里有两种方法.

规则散点图的点可以有内部颜色和边缘颜色.scatter 接受其中任何一个的数组,但不接受两者的数组.因此,您可以遍历所有边缘颜色并将它们绘制在同一图上的循环中.使用线宽可能有助于将真实颜色和预测颜色一起可视化.

Matplotlib 的 plot 函数接受标记

I'm trying to plot both the ground-truth and my classification simultaneously in matplotlib.

Currently, I only plot the groud-truth, after applying tsne on the feature space and adding the edges using the following code

from matplotlib.collections import LineCollection
cols=['rgbkm'[lbl] for lbl in list(data.y.cpu().numpy() - 1)]

lc = LineCollection(X_embedded[out_dict['edges']],linewidth=0.05)
fig = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(X_embedded[:,0].min(), X_embedded[:,0].max())
plt.ylim(X_embedded[:,1].min(), X_embedded[:,1].max())
plt.scatter(X_embedded[:,0],X_embedded[:,1], c=cols)

This gives the following plot:

While, I hope to somehow color each vertex in the following way:

解决方案

Here are two approaches.

The dots of regular scatter plots can have an interior color and an edge color. scatter accepts an array for either one of them, but not for both. So, you could just iterate through all edge colors and plot them in a loop over the same plot. Playing with linewidth might give help to visualize the true and the predicted colors together.

Matplotlib's plot function accepts marker filling styles, which have a possibility of being bicolored, either top-bottom or left-right. Per plot you can only give one type of style. So, for 5 colors, there are 25 combinations which can be drawn in a loop.

Bonus points:

While looping through the colors, plot can generate legend labels with the corresponding bicolored dot.

Here is some code to illustrate the concepts:

from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import numpy as np

N = 50

labels = ['ant', 'bee', 'cat', 'dog', 'elk']  # suppose these are the labels for the prediction
colors = list('rgbkm') # a list of 5 colors
cols_true = np.repeat(range(5), N)  # suppose the first N have true color 0, the next N true color 1, ...
cols_pred = np.random.randint(0, 5, N * 5)  # as a demo, take a random number for each predicted color

# for x and y, suppose some 2D gaussian normal distribution around some centers,
#   this would make the 'true' colors nicely grouped 
x = np.concatenate([np.random.normal(cx, 2, N) for cx in [5, 9, 7, 2, 2]])
y = np.concatenate([np.random.normal(cy, 1.5, N) for cy in [2, 5, 9, 8, 3]])

fig, ax = plt.subplots(figsize=(10,6))
for tc in range(5):
    for pc in range(5):
        mask = (cols_true == tc) & (cols_pred == pc)
        plt.plot(x[mask], y[mask], c=colors[tc], markerfacecoloralt=colors[pc],
                 marker='.', linestyle='', markeredgecolor='None',
                 markersize=15, fillstyle='left', markeredgewidth=0,
                 label=f'Tr: {labels[tc]} - Pr: {labels[pc]}')
plt.legend(loc='upper right', bbox_to_anchor=(1, -0.1), fontsize=10, ncol=5)
plt.tight_layout()
plt.show()

这篇关于如何创建每个点有两种颜色的散点图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆