在matplotlib中创建离散的颜色条

4
我尝试过其他线程,但是无法解决。我试图创建一个离散的色条。大部分代码似乎都在工作,确实出现了一个离散的条,但标签是错误的,并且会抛出错误:“找不到可用于色条创建的映射对象。首先要定义一个映射对象,例如一张图片(使用imshow)或一组轮廓线(使用contourf)。"
我相信错误是因为在plt.colorbar中缺少参数,但不确定它要求什么或如何定义。
以下是我的代码。非常感谢你的建议:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N) 

ex2 = sample_data.plot.scatter(x='order_count', y='total_value',c='cluster', marker='+', ax=ax, cmap='plasma', norm=norm, s=100, edgecolor ='none', alpha=0.70)

plt.colorbar(ticks=np.linspace(0,3,4))
plt.show()
1个回答

11

确实,colorbar 的第一个参数应该是一个 ScalarMappable,它将是散点图的 PathCollection 本身。

设置

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

df = pd.DataFrame({"x" : np.linspace(0,1,20),
                   "y" : np.linspace(0,1,20),
                   "cluster" : np.tile(np.arange(4),5)})

cmap = mpl.colors.ListedColormap(["navy", "crimson", "limegreen", "gold"])
norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N) 

Pandas 绘图

问题在于 pandas 没有直接提供对这个 ScalarMappable 的访问方式。因此,如果只有一个集合存在,可以从轴中的集合列表中捕获它: ax.collections[0]

fig, ax = plt.subplots()
df.plot.scatter(x='x', y='y', c='cluster', marker='+', ax=ax, 
                cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70, colorbar=False)

fig.colorbar(ax.collections[0], ticks=np.linspace(0,3,4))
plt.show()

Matplotlib 绘图

你可以考虑直接使用 matplotlib 绘制散点图,这种情况下,你直接将 scatter 函数返回值作为 colorbar 函数的参数。

fig, ax = plt.subplots()
scatter = ax.scatter(x='x', y='y', c='cluster', marker='+', data=df,
                cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70)

fig.colorbar(scatter, ticks=np.linspace(0,3,4))
plt.show()
输出结果在两种情况下都相同。

输入图像描述


由于这些值是离散的,因此您可以使用range(4)而不是np.linspace(0,3,4),结果将是相同的(除非您想坚持使用NumPy范围)。 - noamtm
如果我不想使用数字0、1、2、3,而是使用名称“A”、“B”、“C”、“D”,该怎么办? - Satyapriya Krishna

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