如何将色条放入 matplotlib 图例中。

5
我有一段代码可以生成如下图所示的图形: enter image description here 在这个图中,颜色表示每条线的底部水平偏移量。我希望在图例中出现一个颜色条(带有“开始”和“结束”),以显示颜色的含义。
以下是我的代码:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx


plt.clf()
plt.plot([0,100], [0,100], '--', linewidth=3, color='k', label = 'start')
plt.plot([100,100],[0,100], '-.', linewidth=3, color = 'k', label = 'stop')



jet = plt.get_cmap('jet') 
cNorm  = colors.Normalize(vmin=0, vmax=99)
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)

for offset in range(1,100):
    colorVal = scalarMap.to_rgba(offset)
    plt.plot([offset, 100], [0,100], color=colorVal)

plt.legend()
plt.show()

理想情况下,我希望有一个标准的色条,范围从0到100,在图例中显示一个名为'offset'的标签。


我认为需要重新措辞一下。你是在寻找一种方法将色条放置在图例的位置,并用边框包围它,对吗? - ImportanceOfBeingErnest
有点类似。我想让它被与“开始”和“停止”周围相同的边框所包围。在我的真实场景中,我有一个处于稳态的人口(我想要明确标记)。然后环境中的某些事物发生了变化,每年人口都会有一些变化(我希望颜色表示年份)。最后是一个稳定状态(我也想要明确标记)。 - Joel
2
有两个选项:(1)创建一个看起来像色条的对象,并将其用作图例的“句柄”。 (2)创建一个色条并将其放置在图例所在的位置,并用灰色框将其包围,使其看起来像在图例中。这两种方法都相当棘手和不平凡;为了帮助潜在的答案者,您可能至少想开始其中之一,并看看您能走多远。 - ImportanceOfBeingErnest
我害怕那可能是答案... 两者都需要我走出我的舒适区,但如果我在今晚的跨太平洋飞行之前有机会,我会尝试一下。 - Joel
1个回答

4

这是一些代码,基于ImportanceOfBeingErnest的第二种方法,可以实现此功能。

import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
from matplotlib.patches import Rectangle

fig, ax = plt.subplots(1)

plt.clf()
plt.plot([0,100], [0,100], '--', linewidth=3, color='k', label = 'start')
plt.plot([100,100],[0,100], '-.', linewidth=3, color = 'k', label = 'stop')

jet = plt.get_cmap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=99)
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
scalarMap.set_array([])

for offset in range(1,100):
    colorVal = scalarMap.to_rgba(offset)
    plt.plot([offset, 100], [0,100], color=colorVal)

plt.gca().add_patch(Rectangle((0.1, 45), 40, 55, edgecolor='gray',
                                            linewidth=3, fill=False))
plt.gca().text(25, 90, "-- start")
plt.gca().text(25, 80, "-. stop")
plt.gca().text(15, 50, "  offset")

cax = fig.add_axes([0.18, 0.48, 0.03, 0.35])

plt.colorbar(scalarMap, cax = cax, ticks=[range(0, 100, 10)],
                                            orientation='vertical')

plt.show()

screen shot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接