matplotlib:添加透明背景的第二轴()?

时间:2011-10-13 23:57:59

标签: python matplotlib

定义数据

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背景,看起来是可见的(或者至少这是我看到的颜色)。

这里发生了什么?

1 个答案:

答案 0 :(得分:40)

你实际上并没有添加新的轴。

Matplotlib检测到该位置已经有一个图并返回它而不是新的轴对象。

(自己检查一下。axnewax将是同一个对象。)

可能没有你想要的原因,但这就是你要做的。

(另外,请勿拨打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()

enter image description here

当然,这看起来很糟糕,但这就是你要求的......

我猜你先前的问题是你只想添加第二个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()

enter image description here

如果你想拥有一个隐藏的,未链接的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()

enter image description here

请注意,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()

enter image description here

您还可以在绘图底部添加额外的脊椎。有时候这更容易,特别是如果你不想要它上面的刻度或数字。不要过多地插入我自己的答案,但这里有一个例子:How do I plot multiple X or Y axes in matplotlib?

最后一点,如果你想通过特定的转换链接不同的x和y轴,请务必查看parasite axes examples