使用同一行连接不同的数据系列

时间:2015-02-24 21:46:17

标签: python matplotlib plot

有没有办法让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 )),因为我需要能够区分正值和原始负值。

1 个答案:

答案 0 :(得分:1)

使用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 - 数组中负数的元素。

上面的例子给出了这个数字:

marked negative


如果您确实有两个不同的数据集,则以下代码将为您提供与上面相同的数字:

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.argsorty - 数组进行排序,以确保在绘图时不会出现过度曲折的线条。在调用第一个绘图时,可以使用该索引数组(sorted)。由于第二个图仅绘制符号但没有连接线,因此这里不需要排序数组。