在 Python Matplotlib 中更改颜色条的颜色
Change colour of colorbar in Python Matplotlib
我有一个代码可以给出预测值与实际值随浓度变化的散点图。数据是从 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?
你的代码 return 对我来说是一个错误 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()
要获得正确的颜色条,请使用以下代码:
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()
对于我随机生成的数据,我得到了以下图表:
现在用 'viridis'
替换 'plasma'
并检查另一个变体。
您不应缩放数据,除非您希望颜色条不正确。从分散调用中获得 PathCollection 后,您可以在其上调用 set_cmap
和 set_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()
我有一个代码可以给出预测值与实际值随浓度变化的散点图。数据是从 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?
你的代码 return 对我来说是一个错误 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()
要获得正确的颜色条,请使用以下代码:
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()
对于我随机生成的数据,我得到了以下图表:
现在用 'viridis'
替换 'plasma'
并检查另一个变体。
您不应缩放数据,除非您希望颜色条不正确。从分散调用中获得 PathCollection 后,您可以在其上调用 set_cmap
和 set_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()