在 matplotlib 中创建一个离散的颜色条

Win*_*nby 2 python matplotlib colorbar

我试过其他线程,但不知道如何解决。我正在尝试创建一个离散的颜色条。大部分代码似乎都在工作,确实出现了一个离散条,但标签是错误的,并抛出错误:“没有找到可用于创建颜色条的可映射。首先定义一个可映射,例如图像(使用 imshow)或轮廓集(带轮廓)。”

很确定错误是因为我在 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()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 6

事实上,第一个参数 tocolorbar应该是 a 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) 
Run Code Online (Sandbox Code Playgroud)

熊猫绘图

问题是 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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出是相同的。

在此处输入图片说明