这是我正在处理的部分 Python 代码:
cm = LinearSegmentedColormap.from_list('defcol', ["#000000", "#FF0000"])
trace_color = cm(np.linspace(0,1,cycles))
for k, color in zip(range(cycles),trace_color):
lis = KL_rest[k::cycles]
plt.scatter(scanpoints, lis, color = color, marker = '^', alpha = 0.9)
这里我使用 for 循环生成散点图,颜色来自列表 trace_color
。我的问题是我是否可以生成一个颜色条,其中颜色来自 trace_color
,颜色条上的标签(比例)来自 range(cycles)
。我尝试在 for 循环之后添加 plt.colorbar()
但没有成功。谢谢!!
最佳答案
Matplotlib 的颜色条需要一个 ScalarMappable
对象。默认情况下,它取自绘制的内容,例如在一次调用中创建的散点图。如果您需要合并多个调用的结果,您可以创建自己的ScalarMappable
。它需要一个颜色图和 a norm .
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.cm import ScalarMappable
import numpy as np
cycles = 7
N = 100
KL_rest = np.sin(np.linspace(0, 10 * np.pi, cycles * N))
scanpoints = np.arange(N)
cm = LinearSegmentedColormap.from_list('defcol', ["#000000", "#FF0000"])
trace_color = cm(np.linspace(0, 1, cycles))
for k, color in zip(range(cycles), trace_color):
lis = KL_rest[k::cycles]
plt.scatter(scanpoints, lis, color=color, marker='^', alpha=0.9)
plt.colorbar(ScalarMappable(cmap=cm, norm=plt.Normalize(0, cycles - 1)), ticks=np.arange(cycles), label='cycles')
plt.show()
请注意,在这种情况下,您可以一次性创建散点图,从而启用默认颜色条。为此,可以在每个周期重复扫描点
,并且可以通过平铺每个扫描点的周期来指示颜色。
如果您只想显示真正使用的颜色,可以在创建颜色图时添加N=cycles
。要将每个数字的刻度线放在单元格的中心,您可以将默认限制移动 0.5
。
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np
cycles = 7
N = 100
KL_rest = np.sin(np.linspace(0, 10 * np.pi, cycles * N))
scanpoints = np.arange(N)
cm = LinearSegmentedColormap.from_list('defcol', ["#000000", "#FF0000"], N=cycles)
plt.scatter(np.repeat(scanpoints, cycles), KL_rest,
c=np.tile(range(cycles), len(scanpoints)),
cmap=cm, norm=plt.Normalize(-0.5, cycles - 0.5),
marker='^', alpha=0.9)
plt.colorbar(ticks=np.arange(cycles), label='cycles')
plt.show()
关于python - 我可以从颜色列表和 for 循环中绘制颜色条吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72525260/