这是一个衍生问题,与根据颜色图设置线条颜色中给出的答案相关,其中一个很好的解决方案是根据颜色条绘制几条带有颜色的线条(见下面的代码和输出图像)。
我有一个列表,其中存储了与每个打印线关联的字符串,如下所示:
legend_list = ['line_1', 'line_2', 'line_3', 'line_4']
我想将这些字符串作为图例添加到绘图右上角的一个框中(第一个字符串对应于第一条绘制线,依此类推)。我怎么能这样做?
如果有必要,我可以不使用LineCollection
,但我需要保留颜色栏以及与之相关的每一行的颜色。
代码和输出
import numpy
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
# The line format you curently have:
lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
[(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
[(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
[(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]
# Reformat it to what `LineCollection` expects:
lines = [zip(x, y) for x, y in lines]
z = np.array([0.1, 9.4, 3.8, 2.0])
fig, ax = plt.subplots()
lines = LineCollection(lines, array=z, cmap=plt.cm.rainbow, linewidths=5)
ax.add_collection(lines)
fig.colorbar(lines)
# Manually adding artists doesn't rescale the plot, so we need to autoscale
ax.autoscale()
plt.show()
使用LineCollection比使用plt更快。如果您有大量的线,但我还没有弄清楚如果使用LineCollection如何添加图例,请打印
。《图例指南》中说要使用代理艺术家,但如果必须为LineCollection中的每个线段创建不同的代理艺术家,最好咬紧牙关,只使用plt。绘图
。
既然你想要一个传奇,那么你有少量的台词似乎是有道理的。事实上,这将是幸运的,因为尝试用plt绘制数千行。绘图
是缓慢的秘诀。
因此,如果您有少量行,那么以下操作应该可以正常工作:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
[(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
[(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
[(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]
z = np.array([0.1, 9.4, 3.8, 2.0])
legend_list = ['line_1', 'line_2', 'line_3', 'line_4']
fig, ax = plt.subplots()
cmap = plt.get_cmap('rainbow')
def normalize(z):
z = z.copy()
z -= z.min()
z /= z.max()
return z
for (x, y), color, label in zip(lines, normalize(z), legend_list):
plt.plot(x, y, label=label, color=cmap(color), lw=5)
m = cm.ScalarMappable(cmap=cmap)
m.set_array(z)
plt.colorbar(m)
ax.legend()
plt.savefig('/tmp/test.png')
@如果您有少量的行,unutbu的答案是正确的方法。(如果你想添加一个传奇,你大概会这样做!)
不过,为了显示另一个选项,您仍然可以使用LineCollection
,您只需要为图例使用代理艺术家:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.lines import Line2D
# The line format you curently have:
lines = [[(0, 1, 2, 3, 4), (4, 5, 6, 7, 8)],
[(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)],
[(0, 1, 2, 3, 4), (8, 7, 6, 5, 4)],
[(4, 5, 6, 7, 8), (0, 1, 2, 3, 4)]]
# Reformat it to what `LineCollection` expects:
lines = [tuple(zip(x, y)) for x, y in lines]
z = np.array([0.1, 9.4, 3.8, 2.0])
fig, ax = plt.subplots()
lines = LineCollection(lines, array=z, linewidths=5,
cmap=plt.cm.rainbow, norm=plt.Normalize(z.min(), z.max()))
ax.add_collection(lines)
fig.colorbar(lines)
# Manually adding artists doesn't rescale the plot, so we need to autoscale
ax.autoscale()
def make_proxy(zvalue, scalar_mappable, **kwargs):
color = scalar_mappable.cmap(scalar_mappable.norm(zvalue))
return Line2D([0, 1], [0, 1], color=color, **kwargs)
proxies = [make_proxy(item, lines, linewidth=5) for item in z]
ax.legend(proxies, ['Line 1', 'Line 2', 'Line 3', 'Line 4'])
plt.show()
我将描述我想要实现的效果,然后我将详细说明我目前如何尝试实现这一点,以及它的行为有什么问题。我还要提到另一种我看过但根本无法工作的方法。 最相关的代码内嵌在问题的底部,以便快速访问。您可以下载源代码的zip文件,或者在BitBucket上获得作为Mercurial资源库的项目。该项目现在合并了以下答案中的修复。如果您想要最初提供的不完整版本,它会被标记为“初始错误版本” 该项目是一个极小的概念验证
下面是关于如何绘制多色线的示例,我可以根据一些彩色地图绘制沿其长度改变颜色的线。为了给剧情添加一个传说,我添加了以下代码: 这会将图例添加到绘图中(下图),但图例中图标的颜色与线条的颜色完全不相关。这是向该绘图添加图例的错误方法,还是matplotlib的限制?
我们在Google Firestore中有一个收藏。 我们是否可以在一条语句中添加一个包含数据的文档和此新文档下的子集合?
问题内容: 这是一个衍生问题,与[Set line colors]中给出的答案有关 根据颜色图](https://stackoverflow.com/questions/19868548/set-line- 颜色(根据colormap),其中有一个伟大的解决方案是建议绘图 根据颜色条用颜色表示的几行(参见代码和输出图像 以下)。 我有一个列表,其中存储与每一条打印线相关联的字符串,如下所示: 我想
尝试添加到集合时出现“Collection was modified”异常 问题出在“添加”方法上。如果我注释掉该部分,则不会引发异常。重要的是要注意,我已经尝试将foreach重写为for循环并添加“ToList()”以形成。链接。在所有情况下都会引发相同的异常。我在站点的其他部分使用这种完全相同的模式没有问题,这就是为什么这如此令人沮丧。这也适用于“创建”。问题只影响“编辑”操作。 其他相关代
我正在尝试使用android studio中的Firestore制作一个课程添加系统。 当用户添加一个课程时,它将被添加到Fi还原中,并且在该课程集合中会有一个学生和教师集合。 但我不知道怎么做。 如果我为学生和教师集合编写代码,它会添加两个不同的集合,但我希望在一个课程集合中有两个集合,学生和教师。 我该怎么做呢? 我分享我写的代码。 添加课程类