繁体   English   中英

如何使用为每个点单独指定的颜色创建散点图?

[英]How to create a scatter plot with color specified for each point individually?

使用matplotlib我创建一个散点图动画,在每秒后显示一个新点,并显示所有旧点部分透明。 每个点由xy定义,但也由类别s 我希望点的颜色与其类别相关联。 理想情况下,这意味着数组s包含值1,2和3,并且属于这些值的颜色是单独定义的。 但是,我无法让这个工作。

我开始工作的是在s单独指定每个点的边缘颜色,其代码如下所示。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as plti
import matplotlib.animation

s = [[1,0,0],[0,1,0],[0,0,1]];
x = [525,480,260];
y = [215,180,180];

img = plti.imread('myimage.png')
fig, ax = plt.subplots()
plt.imshow(img)
plt.axis('off')

x_vals = []
y_vals = []
intensity = []
iterations = len(x)
colors = []

t_vals = np.linspace(0,iterations-1,iterations,dtype=int)
scatter = ax.scatter(x_vals, y_vals, s=100, c=colors, vmin=0, vmax=1)

def init():
    pass

def update(t):
    global x, y, x_vals, y_vals, intensity
    x_vals.extend([x[t]])
    y_vals.extend([y[t]])
    scatter.set_offsets(np.c_[x_vals,y_vals])
    intensity = np.concatenate((np.array(intensity), np.ones(1)))
    if len(intensity) > 1:
        intensity[-2] = 0.5
    scatter.set_array(intensity)
    colors.extend([s[t]])
    scatter.set_color(colors)

    return ani

ani = matplotlib.animation.FuncAnimation(fig, update, frames=t_vals, interval=1000, repeat=False, init_func=init)
plt.show()

简单地将c=colors改为facecolor=colors不起作用。 此外,我曾尝试使用色彩映射,但我也无法使用它。

上面代码生成的动画如下所示。

在此输入图像描述

但是,动画应该看起来像这样..

在此输入图像描述

所以我的问题是; 有人知道如何将每个点的facecolor绑定到该点所属的类别吗?

在matplotlib中绘制具有不同颜色的点的绘图的常规方法是将颜色列表作为参数传递。

例如:

import matplotlib.pyplot
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue'])

在此输入图像描述

但是如果由于某种原因你想只用一个电话就可以做到这一点,你可以制作一个大的颜色列表,列表理解和一些地板划分:

import matplotlib
import numpy as np

X = [1,2,3,4]
Ys = np.array([[4,8,12,16],
      [1,4,9,16],
      [17, 10, 13, 18],
      [9, 10, 18, 11],
      [4, 15, 17, 6],
      [7, 10, 8, 7],
      [9, 0, 10, 11],
      [14, 1, 15, 5],
      [8, 15, 9, 14],
       [20, 7, 1, 5]])
nCols = len(X)  
nRows = Ys.shape[0]

colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys)))

cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat
Xs=X*nRows #use list multiplication for repetition
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs)

在此输入图像描述

出现此问题是因为在scatter.set_color(colors)之前调用了scatter.set_array(intensity)行。 因此,不是通过单独的变量来定义强度,而是直接将其集成到颜色中。 以下代码生成所需的结果。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as plti
import matplotlib.animation

s = [1,2,3];
x = [525,480,260];
y = [215,180,180];

img = plti.imread('myimage.png')
fig, ax = plt.subplots()
plt.imshow(img)
plt.axis('off')

x_vals = []
y_vals = []
iterations = len(x)
colors = []

t_vals = np.linspace(0,iterations-1,iterations,dtype=int)
scatter = ax.scatter(x_vals, y_vals, s=100, color=colors, vmin=0, vmax=1)

def init():
    pass

def update(t):
    global x, y, x_vals, y_vals
    x_vals.extend([x[t]])
    y_vals.extend([y[t]])
    scatter.set_offsets(np.c_[x_vals,y_vals])

    if t > 0:
        if s[t-1] == 1:
            colors[t-1] = [1,0,0,0.5];
        elif s[t-1] == 2:
            colors[t-1] = [0,1,0,0.5];
        else:
            colors[t-1] = [0,0,1,0.5];

    if s[t] == 1:
        colors.extend([[1,0,0,1]])
    elif s[t] == 2:
        colors.extend([[0,1,0,1]])
    else:
        colors.extend([[0,0,1,1]])
    scatter.set_color(colors);

    return ani

ani = matplotlib.animation.FuncAnimation(fig, update, frames=t_vals, init_func=init, interval=1000, repeat=False)
plt.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM