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

hat*_*rix 12 python matplotlib

定义数据

x = np.linspace(0,2*np.pi,100)
y = 2*np.sin(x)
Run Code Online (Sandbox Code Playgroud)

情节

fig = plt.figure()
ax = plt.axes()
fig.add_subplot(ax)
ax.plot(x,y)
Run Code Online (Sandbox Code Playgroud)

添加第二个轴

newax = plt.axes(axisbg='none')
Run Code Online (Sandbox Code Playgroud)

给我ValueError: Unknown element o,尽管它与我将描述的内容完全相同.我也可以看到这样做(没有错误)做同样的事情:

newax = plt.axes()
fig.add_subplot(newax)
newax.set_axis_bgcolor('none')
Run Code Online (Sandbox Code Playgroud)

但是,它将原始图形的背景颜色变为"灰色"(或者图形背景是什么)?我不明白,因为我认为这会使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)
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的,因为我认为一个的背景将叠加在另一个上,但在任何一种情况下,它都是看起来可见的newax背景(或者至少这是我看到的颜色).

这里发生了什么?

Joe*_*ton 44

你实际上并没有添加新轴.

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

(检查它自己.ax并且newax将是同一个对象.)

可能没有你想要的原因,但这就是你如何做到的.

(另外,不要打电话newax = plt.axes()然后打电话给fig.add_subplot(newax)你做两次同样的事情.)

编辑:对于更新的(> = 1.2,我认为?)版本的matplotlib,您可以使用labelkwarg到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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

我猜你之前的问题,你只想添加第二个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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在此输入图像描述

请注意,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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

最后,如果您希望通过特定转换链接不同的x和y轴,请务必查看寄生轴的示例.