【问题标题】:Change colour of colorbar in Python Matplotlib在 Python Matplotlib 中更改颜色条的颜色
【发布时间】:2021-01-07 17:50:56
【问题描述】:

我有一个代码,它为我提供了预测值与实际值作为浓度函数的散点图。数据是从 excel csv 电子表格中提取的。

这是代码:

import matplotlib.pyplot as plt
from numpy import loadtxt


dataset = loadtxt("ColorPlot.csv", delimiter=',')
x = dataset[:,0]
y = dataset[:,1]
z = dataset[:,2]

scaled_z = (z - z.min()) / z.ptp()

colors = plt.cm.viridis(scaled_z)
sc=plt.scatter(x, y, c=colors)
plt.clim(0, 100)
plt.colorbar()
plt.xlabel("Actual")
plt.ylabel("Predicted")

plt.show()

有了这个,我得到了一个很好的图表:

但是,如果我将颜色更改为类似

colors = plt.cm.plasma(scaled_z)

我得到了下面的图表,但颜色条保持不变。

我尝试了很多不同的方法,例如 cmap 或 edgecolors,但我不知道如何更改它。而且我想保持代码尽可能简单,因为我想根据我的 excel 电子表格数据轻松更改 z 的第三个变量。

是否还有一种方法可以让颜色条的比例从 excel 电子表格中获取比例,而无需我手动指定 0-100?

【问题讨论】:

  • 标准方式是调用它为plt.scatter(x, y, c=z, cmap='plasma')。并省略plt.clim()。以这种标准方式,颜色条将获得“等离子”颜色,并指示最低和最高 z 值。相反,如果您希望颜色条介于 0 和 100 之间,您可以使用 scaled_z = 100*(z - z.min()) / z.ptp()plt.scatter(x, y, c=scaled_z, cmap='plasma')。无论如何,最好省略plt.clim()
  • 天哪,这太完美了。从字面上直接解决了它。非常感谢。我删除了缩放的 z 项,将 cmap 放入分散项并删除了 plt.clim()。非常感谢@JohanC​​pan>

标签: python matplotlib scatter-plot colorbar


【解决方案1】:

要获得正确的颜色条,请使用以下代码:

colormap = plt.cm.get_cmap('plasma') # 'plasma' or 'viridis'
colors = colormap(scaled_z)
sc = plt.scatter(x, y, c=colors)
sm = plt.cm.ScalarMappable(cmap=colormap)
sm.set_clim(vmin=0, vmax=100)
plt.colorbar(sm)
plt.xlabel("Actual")
plt.ylabel("Predicted")
plt.show()

对于我随机生成的数据,我得到了以下图:

现在将 'plasma' 替换为 'viridis' 并检查其他变体。

【讨论】:

    【解决方案2】:

    您的代码为我返回错误TypeError: You must first set_array for mappable ...

    以下是适合我的最简单语法:

    import matplotlib.pyplot as plt
    import numpy as np
    
    a = np.random.random(100)
    b = np.random.random(100)
    
    scaled_z = (a + b)/a
    
    plt.figure()
    plt.scatter(a, b, c = scaled_z, cmap = 'plasma') ## you can directly change the colormap here
    plt.colorbar()
    plt.tight_layout()
    plt.show()
    

    【讨论】:

      【解决方案3】:

      您不应该缩放您的数据,除非您希望颜色条不正确。从分散调用中获得 PathCollection 后,您可以在其上调用 set_cmapset_clim 并且颜色栏应该跟踪。 (您也可以明确地将颜色条与 PathCollection 关联以避免歧义)

      import matplotlib.pyplot as plt
      import numpy as np
      
      
      x = np.random.randn(100)
      y = np.random.randn(100)
      z = np.random.randn(100)
      
      sc=plt.scatter(x, y, c=z, cmap='viridis')
      plt.clim(0, 100)
      plt.colorbar(sc)
      plt.xlabel("Actual")
      plt.ylabel("Predicted")
      sc.set_cmap('plasma')
      sc.set_clim(-1, 1)
      
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2020-04-12
        • 2015-01-07
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2013-04-15
        • 2020-10-07
        相关资源
        最近更新 更多