legend()复制自己

时间:2018-06-15 21:27:32

标签: python plot legend

我的以下代码:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.pyplot import legend as legend

x = np.matrix(
    [
        [1, 1, 1, 1],
        [2, 2, 2, 2],
        [3, 3, 3, 3],
        [4, 4, 4, 4]
    ]
)

y = x.transpose()

xx = x
yy = y+0.2

# Vertical Lines of grid:

plt.plot(x, y, 'b-o', label='data1')
plt.plot(xx, yy, 'r-*', label='data2')
legend()
plt.show()

生成类似

的数字

enter image description here

我想做两件事:

  1. 阻止传说重复自我;它应该只显示每个标签一次;像
  2. 这样的东西

    enter image description here

    1. 很好地定位了传奇;说把它放在右上角,与图形的内容没有重叠
    2. 简单/优雅的解决方案非常感谢。非常感谢。

2 个答案:

答案 0 :(得分:2)

由于x(因此,所有其他数组)都是二维数组,当您在其上调用plot()时,它相当于在几个1-上调用plot() d设置,所以你要为这些图中的每一个创建一个标签。

避免这种情况的一种方法是将图分配给变量,然后仅为每个图中的第一个插入图例。

lines = plt.plot(x, y, 'b-o')
other_lines = plt.plot(xx, yy, 'r-*')
plt.legend([lines[0], other_lines[0]], ['data1', 'data2'])

对于图例定位,请查看thisdocumentation

答案 1 :(得分:0)

由于您的xy是矩阵,因此每个矩阵行都会获得与图例中重复的标签相同的标签。

解决方案可能如下所示:

for i in range(x.size[0]):
    plt.plot(x[i], y[i], label='data1' if i == 0 else None)
    plt.plot(xx[i], yy[i], label='data2' if i == 0 else None)