matplotlib 散点图问题 + 子图只有一个值

Trouble with matplotlib scatter plot + subplot only one value

我是 matplotlib 的新手,我想创建一个绘图和 0-1 范围的比例作为输出;标记颜色与刻度相同。我用 colorbar 方法在散点图中完成了它,但必须指定另一个 imshow 来绘制 colorbar。问题是我得到了一个从 0 到 0.5 的矩形,与标记的颜色相同,经过几天的尝试,我无法擦除它(没有擦除 colorbar/scale)。

我们将不胜感激任何帮助!

import matplotlib.pyplot as plt
import matplotlib.cm as cm

data =[0,0.7]
for l in data:         
    cmap1 = cm.RdYlBu_r(l)
    fig = plt.figure(dpi=300)
    ax = fig.add_subplot(1,1,1)
    ax.grid()

    sc = plt.scatter(0, l, s=500, color= cmap1)
    cax = ax.imshow([[l]],vmin=0, vmax=1, interpolation='nearest',aspect=5, cmap= plt.cm.RdYlBu_r)

    plt.yticks([0,0.5, 1])
    plt.xticks([])

    plt.colorbar(cax)
    axes = plt.gca()
    plt.show

这是生成的图像:

编辑:我已经搜索了 'matplotlib colorbar for scatter' 和所有变体,但在应用它时出现错误,例如 'TypeError: You must first set_array for mappable'。我想是因为我一次只能映射一个值。抱歉,如果不是那样的话;我是 matplotlib 的新手,我知道我想做一些特别的事情。

您得到的彩色矩形来自 imshow 图。由于您不想要该矩形,请删除 imshow 图。

下一步是获取颜色条。 plt.colorbar 需要 ScalarMappable 作为第一个参数。所以一个好主意是提供散点图作为参数, plt.colorbar(sc)

此时您可能会收到一条错误消息 "You must first set_array for mappable"。仔细观察散点图(plt.scatter(0, l, s=500, color= cmap1),一旦可以看到确实没有应用映射,因为单一颜色由 color 参数定义。为了成为有用的 ScalarMappable,您需要定义一个可以使用 c 参数映射到颜色的数组。因此,与其像使用 cmap1 = cm.RdYlBu_r(l) 那样手动进行映射,不如将这一步留给散点图。

sc = plt.scatter(0, l, s=500, c=l, vmin=0, vmax=1,cmap= plt.cm.RdYlBu_r)

现在绘图有效,但看起来很糟糕,因此您可能需要应用一些设置,例如纵横比、限制图形大小等。

总的来说,您可能会得到这样的结果:

import matplotlib.pyplot as plt

data =[0,0.4,0.7,0.9]
for l in data:         
    fig = plt.figure(figsize=(2,3), dpi=100)
    ax = fig.add_subplot(1,1,1, aspect=10)
    ax.grid()

    sc = plt.scatter(0, l, s=500, c=l, vmin=0, vmax=1,cmap= plt.cm.RdYlBu_r)

    plt.xlim([-1,1])
    plt.ylim([0,1])
    plt.yticks([0,0.5, 1])
    plt.xticks([])

    plt.colorbar(sc)
    plt.subplots_adjust(right=0.7)
    plt.show()