如何根据第三个变量为散点标记着色

199

我想制作一个散点图(使用matplotlib),其中点根据第三个变量进行着色。我已经接近成功了:

plt.scatter(w, M, c=p, marker='s')

w 和 M 是数据点,p 是我想要进行阴影处理的变量。
然而,我想使用灰度而不是彩色。有人能帮忙吗?

4个回答

210

不需要手动设置颜色。相反,指定灰度色彩地图即可...

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500) # s is a size of marker 
plt.gray()

plt.show()

在此输入图片描述

或者,如果您希望有更广泛的颜色映射,您也可以指定cmap关键字参数来使用scatter函数。要使用这些颜色映射的反转版本,只需指定其中任何一个的“_r”版本即可。例如,使用gray_r代替gray。 有几个不同的灰度颜色映射预设(例如graygist_yargbinary等)。

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()

1
谢谢!有没有办法在这些点周围绘制轮廓,其中包含总重量的一定数量? - Thomas Collett
6
mpl.cm也可以直接使用plt.cm来调用。 - heltonbiker
如果你想要绘制轮廓线,你需要将数据从点插值到一个二维矩阵中,然后使用 plt.contour()plt.contourf() 绘制 -- 但这是一个不同的问题。 - Zak
你如何在图例中添加标签?在这种情况下,使用连续数字,我猜想你会使用色条。那么对于离散值呢?例如,我能否为我的三个类别在图例中添加3个标签? - Nate

32
在matplotlib中,灰色可以用0-1之间的数字字符串表示。
例如: c = '0.1' 然后你可以将第三个变量转换为此范围内的值,并使用它来给你的点着色。
在下面的例子中,我使用了点的y位置作为确定颜色的值:
from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

在这里输入图片描述


4
记录一下,如果你提供一个形状为(n,4)的数组作为c参数,并在第四列中提供 alpha 值,则可以将 ALPHA 应用为一种颜色映射。 如果第三个变量是Z,且形状为 (n,1),则 colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max())) 会产生非常好的效果(当然可以进行微调)。 - heltonbiker
我遇到了一个错误:'rgba序列的长度应该是3或4'。 - MattCochrane
1
@MattClimbs 我猜你在调用plt.plot而不是像例子中一样调用plt.scatter。 - smashbro
你如何向这个图添加一个颜色条? - FaCoffee
@CF84 你可能想把这个作为一个新问题。 - joaquin
2
@FaCoffee plt.colorbar()会做到这一点。 - Mathew Savage

16

有时您可能需要根据x值准确地绘制颜色。例如,您可能会拥有一个包含3种类型变量和一些数据点的数据框。并且您想要执行以下操作

  • 将与物理变量“A”对应的点绘制为红色。
  • 将与物理变量“B”对应的点绘制为蓝色。
  • 将与物理变量“C”对应的点绘制为绿色。

在这种情况下,您可能需要编写一个简短的函数来将x值映射到相应的颜色名称列表,然后将该列表传递给plt.scatter命令。

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

将散点图按x变量着色


2
如何为此图创建一个彩色条? - MRM
1
如何为此形成图例?我已经按照上述函数映射了我选择的颜色,但我想创建一个对应于每种颜色的图例。 - Paul

0
一个非常直接的解决方案也是这个:
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8,8)) 

p = ax.scatter(x, y, c=y, cmap='cmo.deep')
fig.colorbar(p,ax=ax,orientation='vertical',label='labelname')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接