我正在尝试将colorbar
添加到不包含“ matplotlib
”的Python库mappable
创建的图形中。据我所知,mapable
是某种对象,例如轮廓,它具有离散值,可以在其上映射colormap
。尽管就我而言,我正在以编程方式生成对plot
(行)的调用,这些调用不包含在mappable
对象中。我没有看到colorbar
的构造器/方法,该构造器/方法不假定图中已存在mappable
对象。
到目前为止,我的图形看起来像(我似乎无法获得良好的图像,但是我认为这可行;是的,这是一种可怕的配色方案)
这是一个SSCCE代码,用于生成图形,就像我针对问题的方式一样
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.backends.backend_pdf import PdfPages
colorDict = {'red': [(0.0, 1.0, 1.0), (1.0, 0.0, 0.0)], 'green': [(0.0, 0.0, 0.0), (1.0, 1.0, 1.0)], 'blue': [(0.0, 0.0, 1.0), (1.0, 0.0, 0.0)]}
rgColorMap = LinearSegmentedColormap('RedGreen', colorDict, 10)
seedColors = cm.get_cmap(rgColorMap, 10)
graphPdf = PdfPages('Example.pdf')
fig = plt.figure(figsize=(8.27, 11.69), dpi=100)
for lineInd in range(1, 9):
plt.plot([x for x in range(1, 10)], [y*lineInd for y in range(1, 10)], color=seedColors(lineInd))
graphPdf.savefig(fig)
graphPdf.close()
在这种情况下,如何在不绘制
colorbar
对象的情况下创建mappable
?我唯一的解决方案是将循环中绘制的数据分组为
mappable
,然后在循环结束后进行绘制,还是有一种方法可以实例化colorbar
而无需某种mappable
? 最佳答案
您当然可以创建自己的ScalarMappable,
sm = plt.cm.ScalarMappable(cmap=...)
然后将需要具有映射到颜色(
sm.set_array()
)的数组。import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np
colorDict = {'red': [(0.0, 1.0, 1.0), (1.0, 0.0, 0.0)], 'green': [(0.0, 0.0, 0.0), (1.0, 1.0, 1.0)], 'blue': [(0.0, 0.0, 1.0), (1.0, 0.0, 0.0)]}
rgColorMap = matplotlib.colors.LinearSegmentedColormap('RedGreen', colorDict, 10)
seedColors = plt.cm.get_cmap(rgColorMap, 10)
sm = plt.cm.ScalarMappable(cmap=seedColors)
sm.set_array(range(1, 9))
fig = plt.figure(figsize=(8.27, 11.69), dpi=100)
for lineInd in range(1, 9):
plt.plot([x for x in range(1, 10)], [y*lineInd for y in range(1, 10)], color=seedColors(lineInd))
fig.colorbar(sm, ticks=range(1,9), boundaries=np.arange(0.5,9,1))
plt.show()