matplotlib 如何根据y轴的值为散点图着色

llew8vvj  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(143)

大家好,我做了一个散点图基于两个列表。现在我想根据y轴值为散点图着色。例如,如果y轴上的值大于30000,我想将其着色为红色,其余值为蓝色?最好的办法是什么

sf6xfgos

sf6xfgos1#

如果你使用的是Numpy的ndarrays,那么就更简单了

import numpy as np
import matplotlib.pyplot as plt

# test data
y = np.random.randint(2800, 3100, size=(100,))
x = np.arange(0, 100)

# create a Boolean array (a mask), possibly negate it using the "~" unary operator
ygt3000 = y>3000
plt.scatter(x[~ygt3000], y[~ygt3000], color='blue')
plt.scatter(x[ygt3000], y[ygt3000], color='red')

如果你使用的是***真实的***列表,它会稍微复杂一些,但是可以使用列表解析来完成

x = x.tolist()
y = y.tolist()

ygt3000 = [val>3000 for val in y]
plt.scatter([xv for xv, ygt in zip(x, ygt3000) if not ygt],
            [yv for yv, ygt in zip(y, ygt3000) if not ygt], color='blue') 
plt.scatter([xv for xv, ygt in zip(x, ygt3000) if ygt],
            [yv for yv, ygt in zip(y, ygt3000) if ygt], color='red')

这里它是上述代码应用于两个随机数序列时的结果。

2021年8月,因为特伦顿·麦金尼做了一个漂亮的编辑(谢谢特伦顿)这个帖子再次引起了我的注意,我看到了光明

plt.scatter(x, y, c=['r' if v>3000 else 'b' for v in y])

仅仅一天后,我意识到类似的壮举可以用在Numpy上,利用 * 高级索引 *

plt.scatter(x, y, c=np.array(('b','r'))[(y>3000).astype(int)])

但老实说,我更喜欢我以前使用的两遍方法,因为它更切中要害,传达的意思也更多。或者,换句话说,后者看起来像是混淆的代码……

相关问题