【问题标题】:Show all colors on colorbar with scatter plot使用散点图在颜色条上显示所有颜色
【发布时间】:2018-04-09 06:37:55
【问题描述】:

在下面我使用 scatter 和一个自己的ListedColormap 来绘制一些彩色数据点。另外还绘制了对应的colorbar

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap, ListedColormap, BoundaryNorm
from numpy import arange

fig, ax = plt.subplots()

my_cm = ListedColormap(['#a71b1b','#94258f','#ea99e6','#ec9510','#ece43b','#a3f8ff','#2586df','#035e0d'])
bounds=range(8)
norm = BoundaryNorm(bounds, my_cm.N)

data = [1,2,1,3,0,5,3,4]
ret = ax.scatter(range(my_cm.N), [1]*my_cm.N, c=data, edgecolors='face', cmap=my_cm, s=50)
cbar = fig.colorbar(ret, ax=ax, boundaries=arange(-0.5,8,1), ticks=bounds, norm=norm)
cbar.ax.tick_params(axis='both', which='both',length=0)

如果我的数据没有覆盖边界间隔的每个值,colorbar 不会显示所有颜色(如添加的图中)。如果将data 设置为range(8),我会得到每种颜色的一个点,colorbar 也会显示所有颜色。

即使data 不包含所有边界值,如何强制colorbar 显示所有定义的颜色?

【问题讨论】:

    标签: python-2.7 matplotlib scatter-plot


    【解决方案1】:

    您需要在调用ax.scatter时手动设置vminvmax

    ret = ax.scatter(range(my_cm.N), [1]*my_cm.N, c=data, edgecolors='face', cmap=my_cm, s=50, vmin=0, vmax=7)

    导致

    如果我的数据没有覆盖边界区间的每个值,则颜色条不会显示所有颜色(如添加的图中所示)。

    如果 vminvmax 为 `None,则通过该方法设置颜色限制 autoscale_None,因此会使用您的数据的最小值和最大值。

    因此,使用您的代码实际上不需要在颜色栏中显示所有颜色以覆盖边界间隔的每个值,只需要包含最小值和最大值。 使用例如data = [0,0,0,0,0,0,0,7] 结果如下:

    【讨论】:

      【解决方案2】:

      在寻找其他东西时,我找到了解决该问题的另一种方法:colorbar-for-matplotlib-plot-surface-command。 在这种情况下,我不需要设置vminvmax,如果要绘制的点的数组/列表为空,它也可以工作。相反,ScalarMappable 被定义并提供给colorbar,而不是scatterinstance。

      import matplotlib.pyplot as plt
      from matplotlib.colors import LinearSegmentedColormap, ListedColormap, BoundaryNorm
      import matplotlib.cm as cm
      from numpy import arange
      
      fig, ax = plt.subplots()
      
      my_cm = ListedColormap(['#a71b1b','#94258f','#ea99e6','#ec9510','#ece43b','#a3f8ff','#2586df','#035e0d'])
      bounds=range(8)
      norm = BoundaryNorm(bounds, my_cm.N)
      mappable = cm.ScalarMappable(cmap=my_cm)
      mappable.set_array(bounds)
      
      data = [] # also x and y can be []
      ax.scatter(x=range(my_cm.N), y=[1]*my_cm.N, c=data, edgecolors='face', cmap=my_cm, s=50)
      cbar = fig.colorbar(mappable, ax=ax, boundaries=arange(-0.5,8,1), ticks=bounds, norm=norm)
      cbar.ax.tick_params(axis='both', which='both',length=0)
      

      【讨论】:

        猜你喜欢
        • 2020-05-29
        • 2014-09-10
        • 2021-06-13
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 2016-11-16
        • 1970-01-01
        相关资源
        最近更新 更多