使用Python中子图的公共线创建Matplotlib图

时间:2014-04-03 14:22:26

标签: python graph matplotlib

对于即将到来的作业,我需要制作一系列图表,其中有两个图表,其中一条线从一个图形到另一个图形,在另一个图形上的该线下面区域着色。

如粗略图所示:

enter image description here

这就是我目前所拥有的: enter image description here

从这段代码:

from matplotlib import pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.plot([0,1,2,3,4,5,6,7,8,9,10], [1,1,1,1,1,0,0,0,0,0,0], '-b')
ax1.plot([0,1,2,3,4,5,6,7,8,9,10], [0,0,0,0,0,1,1,1,1,1,1], '-r')
ax1.set_ylim([0, 1.2])

ax2 = fig.add_subplot(122)
ax2.plot([0,5,10,15,20,25,30,35,40], [1,1,1,1,0,0,0,0,0], '-b')
ax2.plot([0,5,10,15,20,25,30,35,40], [0,0,0,0,1,1,1,1,1], '-r')
ax2.set_ylim([0, 1.2])

plt.show()

显然,这只会生成两个图表,但我还是无法在两个图表中添加该行。

我真的希望能够在python中使用Matplotlib来更改值(在示例中为45),并且彩色区域会自动更改。

谢谢!

1 个答案:

答案 0 :(得分:2)

有三个步骤:1,找到左侧面板中绿线和蓝线之间的截点。 2,找到右侧面板中红色和线条之间的截点。 3,填补之间的区域。这些步骤涉及np.interp scipy.interpolat scipy.optimizeplt.fill_between,您应该查看这些步骤。

from matplotlib import pyplot as plt
import numpy as np
import scipy.interpolate as spinp
import scipy.optimize as spop

fig = plt.figure(figsize=(16,4))
ax1 = fig.add_subplot(121)
x  = [0,10,20,30,40,50,60,70,80,90,100]
yr = [1,1,1,1,1,0,0,0,0,0,0]
yg = [0,0,0,0,0,1,1,1,1,1,1]
turn_pt = np.interp(45, x, yr) #change 45 to whatever.
yb = [0.,turn_pt,turn_pt]
ax1.plot(x, yr, '-r')
ax1.plot(x, yg, '-g')
xb = [45, 45, 200]
ll = plt.plot(xb,yb, '-b')
ll[0].set_clip_on(False) 
plt.axis([0,100,0,1.2])
#the above three lines to draw the line out of the box.

ax2 = fig.add_subplot(122)
yr = [1,1,1,1,0,0,0,0,0]
yg = [0,0,0,0,1,1,1,1,1]
x  = [0,5,10,15,20,25,30,35,40]
brk_pt_f = lambda X, V: (spinp.interp1d(x, yr)(X)-V)**2
brk_pt = spop.fmin(brk_pt_f, 17., args=(turn_pt,), disp=0) #17. is you inital guess,
#the above two lines solve for the intersection between the blue line and the red line
zero_pt = 20.
start_pt= 0.
xb = np.hstack((start_pt, brk_pt, zero_pt))
yb = [turn_pt,turn_pt,0]
ax2.plot(x, yr, '-r')
ax2.plot(x, yg, '-g')
ax2.plot(xb, yb, '-b')
ax2.hlines(turn_pt,0, 40, 'b', alpha=0.)
ax2.fill_between(xb, yb, 0, alpha=0.4)
ax2.set_ylim([0, 1.2])
ax2.set_xlim([0, 40])

enter image description here

有一些解决方案可以摆脱顶部的x轴和右边的y轴,请搜索较旧的SO帖子。

最后,欢迎来到SO。