定义数据
x = np.linspace(0,2*np.pi,100)
y = 2*np.sin(x)
剧情
fig = plt.figure()
ax = plt.axes()
fig.add_subplot(ax)
ax.plot(x,y)
添加第二轴
newax = plt.axes(axisbg='none')
给我ValueError: Unknown element o
,即使它与我将描述的内容完全相同。我也可以看到这样做(没有错误)做同样的事情:
newax = plt.axes()
fig.add_subplot(newax)
newax.set_axis_bgcolor('none')
然而,它将原始图形的背景颜色变为“灰色”(或者图形背景是什么)?我不明白,因为我认为这会使newax透明,除了图周围的轴和框。即使我切换订单,同样的事情:
plt.close('all')
fig = plt.figure()
newax = plt.axes()
fig.add_subplot(newax)
newax.set_axis_bgcolor('none')
ax = plt.axes()
fig.add_subplot(ax)
ax.plot(x,y)
这是令人惊讶的,因为我认为其中一个的背景将叠加在另一个上,但在任何一种情况下,它都是newax背景,看起来是可见的(或者至少这是我看到的颜色)。
这里发生了什么?
答案 0 :(得分:40)
你实际上并没有添加新的轴。
Matplotlib检测到该位置已经有一个图并返回它而不是新的轴对象。
(自己检查一下。ax
和newax
将是同一个对象。)
可能没有你想要的原因,但这就是你要做的。
(另外,请勿拨打newax = plt.axes()
,然后致电fig.add_subplot(newax)
您正在做同样的事情两次。)
编辑:对于更新的(> = 1.2,我认为?)版本的matplotlib,您可以使用label
kwarg到fig.add_subplot来完成与下面示例相同的操作。例如。 newax = fig.add_subplot(111, label='some unique string')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
# If you just call `plt.axes()` or equivalently `fig.add_subplot()` matplotlib
# will just return `ax` again. It _won't_ create a new axis unless we
# call fig.add_axes() or reset fig._seen
newax = fig.add_axes(ax.get_position(), frameon=False)
ax.plot(range(10), 'r-')
newax.plot(range(50), 'g-')
newax.axis('equal')
plt.show()
当然,这看起来很糟糕,但这就是你要求的......
我猜你先前的问题是你只想添加第二个x轴?如果是这样,这是完全不同的事情。
如果你想连接y轴,那么做这样的事情(有点冗长......):
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
newax = ax.twiny()
# Make some room at the bottom
fig.subplots_adjust(bottom=0.20)
# I'm guessing you want them both on the bottom...
newax.set_frame_on(True)
newax.patch.set_visible(False)
newax.xaxis.set_ticks_position('bottom')
newax.xaxis.set_label_position('bottom')
newax.spines['bottom'].set_position(('outward', 40))
ax.plot(range(10), 'r-')
newax.plot(range(21), 'g-')
ax.set_xlabel('Red Thing')
newax.set_xlabel('Green Thing')
plt.show()
如果你想拥有一个隐藏的,未链接的y轴和一个全新的x轴,那么你可以这样做:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
newax = fig.add_axes(ax.get_position())
newax.patch.set_visible(False)
newax.yaxis.set_visible(False)
for spinename, spine in newax.spines.iteritems():
if spinename != 'bottom':
spine.set_visible(False)
newax.spines['bottom'].set_position(('outward', 25))
ax.plot(range(10), 'r-')
x = np.linspace(0, 6*np.pi)
newax.plot(x, 0.001 * np.cos(x), 'g-')
plt.show()
请注意,newax
上绘制的任何内容的y轴值都不会显示。
如果你愿意,你甚至可以更进一步,并拥有独立的x和y轴(我不太确定它的意义,但它看起来很整洁......):
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2, right=0.85)
newax = fig.add_axes(ax.get_position())
newax.patch.set_visible(False)
newax.yaxis.set_label_position('right')
newax.yaxis.set_ticks_position('right')
newax.spines['bottom'].set_position(('outward', 35))
ax.plot(range(10), 'r-')
ax.set_xlabel('Red X-axis', color='red')
ax.set_ylabel('Red Y-axis', color='red')
x = np.linspace(0, 6*np.pi)
newax.plot(x, 0.001 * np.cos(x), 'g-')
newax.set_xlabel('Green X-axis', color='green')
newax.set_ylabel('Green Y-axis', color='green')
plt.show()
您还可以在绘图底部添加额外的脊椎。有时候这更容易,特别是如果你不想要它上面的刻度或数字。不要过多地插入我自己的答案,但这里有一个例子:How do I plot multiple X or Y axes in matplotlib?
最后一点,如果你想通过特定的转换链接不同的x和y轴,请务必查看parasite axes examples。