散点图的matplotlib色标

135 投票
3 回答
261742 浏览
提问于 2025-04-16 17:59

我正在处理一些数据,这些数据有三个绘图参数:x、y和c。请问如何为散点图创建自定义的颜色值呢?

我想扩展这个例子

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

但是结果出现了一个错误:TypeError: You must first set_array for mappable

3 个回答

1

如果你想根据两个变量来散点图,并用第三个变量来上色,Altair 是个不错的选择。

创建数据集

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Altair 绘图

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

图表

在这里输入图片描述

40

这里是面向对象编程(OOP)的方法来添加一个颜色条:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
256

在matplotlib的文档中关于散点图的说明里提到:

只有当c是一个浮点数数组时,cmap才会被使用。

所以你的颜色列表需要是一个浮点数的列表,而不是现在的元组列表。

plt.colorbar()需要一个可映射的对象,比如plt.scatter()返回的CircleCollection。

vmin和vmax可以用来控制你的颜色条的范围。超出vmin和vmax的部分会使用端点的颜色。

这样对你有帮助吗?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

示例图片

撰写回答