matplotlib传说:我看到一切都是两次

时间:2018-01-21 23:17:59

标签: python matplotlib

我有几个数据系列,每个系列都是无噪声的理论曲线,以及需要用图例显示的Nx2噪声数据阵列。以下代码有效,但由于Nx2数据,我在图例中得到两个条目...有没有办法避免这种情况?

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0,1,0.001)
td = np.arange(0,1,0.1)
td = np.atleast_2d(td).T
N = len(td)
x1 = t
x1r = td + 0.1*np.random.randn(N,2)
x2 = 2-t
x2r = 2-td + 0.1*np.random.randn(N,2)

plt.plot(t,x1,color='red')
plt.plot(td,x1r,'.',color='red',label='A')

plt.plot(t,x2,color='green')
plt.plot(td,x2r,'x',color='green',label='B')

plt.legend()

enter image description here

2 个答案:

答案 0 :(得分:2)

我可以通过指定图例上的句柄来解决问题:

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0,1,0.001)
td = np.arange(0,1,0.1)
td = np.atleast_2d(td).T
N = len(td)
x1 = t
x1r = td + 0.1*np.random.randn(N,2)
x2 = 2-t
x2r = 2-td + 0.1*np.random.randn(N,2)

plt.plot(t,x1,color='red')
red_dots,_ = plt.plot(td,x1r,'.',color='red',label='A')

plt.plot(t,x2,color='green')
green_xs,_ =plt.plot(td,x2r,'x',color='green',label='B')

plt.legend(handles=[red_dots, green_xs])
plt.show()

enter image description here

但是,我不太清楚为什么你会遇到这个问题...当我对它有更深入的了解时会更新答案。

答案 1 :(得分:1)

您将获得2个图例条目,因为您绘制了具有两列的矢量,即每列会获得一个图例条目。通常会绘制一维数组,因此会得到一个图例条目。

至少在问题的情况下,没有理由绘制2D数组,因此解决方案是使用单个维度。

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0,1,0.001)
td = np.arange(0,1,0.1)
td = np.repeat(td,2)
N = len(td)
x1 = t
x1r = td + 0.1*np.random.randn(N)
x2 = 2-t
x2r = 2-td + 0.1*np.random.randn(N)

plt.plot(t,x1,color='red')
plt.plot(td,x1r,'.',color='red',label='A')

plt.plot(t,x2,color='green')
plt.plot(td,x2r,'x',color='green',label='B')

plt.legend()
plt.show()

如果由于某种原因你需要有2D数组(例如因为它们来自代码的其他部分),你可以简单地绘制它们的扁平版本。

plt.plot(td.flatten(),x1r.flatten(),'.',color='red',label='A')

最后,似乎最新的matplotlib版本(2.1.1)实际上没有2个图例条目,即使绘制了2列,因此更新也可能是一个解决方案。