用同一条线连接不同的数据系列
Connect different data series with the same line
有没有办法让matplotlib用同一行连接来自两个不同数据集的数据?
上下文:我需要以对数刻度绘制一些数据,但其中一些是负数。我使用以不同颜色绘制数据绝对值的解决方法(红色表示正数,绿色表示负数),例如:
import pylab as pl
pl.plot( x, positive_ys, 'r-' ) # positive y's
pl.plot( x, abs( negative_ys ), 'g-' ) # negative y's
pl.show()
但是,由于它们表示相同的数量,因此将两个数据系列用同一条线连接起来会很有帮助。这可能吗?
我不能使用 pl.plot( x, abs( ys ))
因为我需要能够区分正值和最初的负值。
通过 numpy,您可以使用逻辑索引。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.array([10000, 1000, 100, 10, 1, 5, 50, 500, 5000, 50000])
y = np.array([-10000, -1000, -100, -10, -1, 5, 50, 500, 5000, 50000])
ax.plot(x,abs(y),'+-b',label='all data')
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none',
markeredgecolor='r',
label='we are negative')
ax.set_xscale('log')
ax.set_yscale('log')
ax.legend(loc=0)
plt.show()
关键特征是首先绘制所有绝对 y
值,然后将那些最初为负值的值重新绘制为空心圆以将它们挑出来。第二步使用逻辑索引 x[y<=0]
和 y[y<=0]
来仅选择 y
数组中的负数元素。
上面的例子给你这个数字:
如果你真的有两个不同的数据集,下面的代码会给你和上面一样的图:
x1 = np.array([1, 10, 100, 1000, 10000])
x2 = np.array([5, 50, 500, 5000, 50000])
y1 = np.array([-1, -10, -100, -1000, -10000])
y2 = np.array([5, 50, 500, 5000, 50000])
x = np.concatenate((x1,x2))
y = np.concatenate((y1,y2))
sorted = np.argsort(y)
ax.plot(x[sorted],abs(y[sorted]),'+-b',label='all data')
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none',
markeredgecolor='r',
label='we are negative')
在这里,您首先使用 np.concatenate
组合 x
- 和 y
- 数组。然后,您使用 np.argsort
对 y
数组进行排序,以确保您在绘图时不会得到过于曲折的线条。当您调用第一个图时,您使用该索引数组 (sorted
)。由于第二张图只画符号而没有画连接线,所以这里不需要排序数组。
有没有办法让matplotlib用同一行连接来自两个不同数据集的数据?
上下文:我需要以对数刻度绘制一些数据,但其中一些是负数。我使用以不同颜色绘制数据绝对值的解决方法(红色表示正数,绿色表示负数),例如:
import pylab as pl
pl.plot( x, positive_ys, 'r-' ) # positive y's
pl.plot( x, abs( negative_ys ), 'g-' ) # negative y's
pl.show()
但是,由于它们表示相同的数量,因此将两个数据系列用同一条线连接起来会很有帮助。这可能吗?
我不能使用 pl.plot( x, abs( ys ))
因为我需要能够区分正值和最初的负值。
通过 numpy,您可以使用逻辑索引。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.array([10000, 1000, 100, 10, 1, 5, 50, 500, 5000, 50000])
y = np.array([-10000, -1000, -100, -10, -1, 5, 50, 500, 5000, 50000])
ax.plot(x,abs(y),'+-b',label='all data')
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none',
markeredgecolor='r',
label='we are negative')
ax.set_xscale('log')
ax.set_yscale('log')
ax.legend(loc=0)
plt.show()
关键特征是首先绘制所有绝对 y
值,然后将那些最初为负值的值重新绘制为空心圆以将它们挑出来。第二步使用逻辑索引 x[y<=0]
和 y[y<=0]
来仅选择 y
数组中的负数元素。
上面的例子给你这个数字:
如果你真的有两个不同的数据集,下面的代码会给你和上面一样的图:
x1 = np.array([1, 10, 100, 1000, 10000])
x2 = np.array([5, 50, 500, 5000, 50000])
y1 = np.array([-1, -10, -100, -1000, -10000])
y2 = np.array([5, 50, 500, 5000, 50000])
x = np.concatenate((x1,x2))
y = np.concatenate((y1,y2))
sorted = np.argsort(y)
ax.plot(x[sorted],abs(y[sorted]),'+-b',label='all data')
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none',
markeredgecolor='r',
label='we are negative')
在这里,您首先使用 np.concatenate
组合 x
- 和 y
- 数组。然后,您使用 np.argsort
对 y
数组进行排序,以确保您在绘图时不会得到过于曲折的线条。当您调用第一个图时,您使用该索引数组 (sorted
)。由于第二张图只画符号而没有画连接线,所以这里不需要排序数组。