Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib:添加具有透明背景的第二个轴()?_Python_Matplotlib - Fatal编程技术网

Python matplotlib:添加具有透明背景的第二个轴()?

Python matplotlib:添加具有透明背景的第二个轴()?,python,matplotlib,Python,Matplotlib,定义数据 x = np.linspace(0,2*np.pi,100) y = 2*np.sin(x) 密谋 添加第二个轴 newax = plt.axes(axisbg='none') 给我ValueError:Unknown元素o,尽管它的作用与我将要描述的相同。我还可以看到,这也可以(没有错误)做同样的事情: newax = plt.axes() fig.add_subplot(newax) newax.set_axis_bgcolor('none') plt.close('all'

定义数据

x = np.linspace(0,2*np.pi,100)
y = 2*np.sin(x)
密谋

添加第二个轴

newax = plt.axes(axisbg='none')
给我
ValueError:Unknown元素o
,尽管它的作用与我将要描述的相同。我还可以看到,这也可以(没有错误)做同样的事情:

newax = plt.axes()
fig.add_subplot(newax)
newax.set_axis_bgcolor('none')
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透明,除了图形周围的轴和框。即使我切换顺序,同样的事情:

newax = plt.axes()
fig.add_subplot(newax)
newax.set_axis_bgcolor('none')
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背景看起来是可见的(或者至少这是我看到的颜色)


这里发生了什么?

您实际上并没有添加新轴

Matplotlib检测到该位置已存在绘图,并返回该绘图,而不是新的Axis对象

(自己检查。
ax
newax
将是同一个对象。)

你可能没有理由这么做,但下面是你怎么做的

(另外,不要调用
newax=plt.axes()
,然后再调用
fig.add\u subplot(newax)
执行相同的操作两次。)

编辑:对于更新的(>=1.2,我想?)版本的matplotlib,您可以通过使用
标签
kwarg to fig.add_子图来完成与下面示例相同的事情。例如,
newax=fig.add_子批次(111,label='some unique string')

当然,这看起来很糟糕,但这正是你想要的

从前面的问题中我猜你只是想添加第二个x轴?如果是这样,那就完全不同了

如果要链接y轴,请执行以下操作(有点冗长…):

如果您想要有一个隐藏的、未链接的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轴(我不太确定它的意义是什么,但它看起来很整洁……):

也可以只在绘图底部添加一个额外的脊椎。有时这会更容易,尤其是当你不想沿着它打勾或数字的东西时。我不想太多地插入我自己的答案,但这里有一个例子:


最后一件事是,如果希望通过特定变换将不同的x轴和y轴链接起来,请务必查看。是的,确实是关于两个轴的。。。我没有得到twinx和twiny(我想我应该知道第二个存在),但我认为没有必要“链接”,只要绘图宽度相同(因为我可以设置相等的限制)所以如果我愿意的话,第一个例子也可以通过关闭其他脊椎的可见性来实现。matplotlib中的每个方法似乎都有很多变体,因此我选择了一些在大多数情况下都可以应用的“通用”函数,而不必学习每个可用的“方便”函数。。。但是谢谢,这解决了所有问题。但是plt.axes()返回相同的对象是一个惊喜——我想这就是plt.gca()的用途。这与Matlab不同,
plt.axes()
在任何其他情况下都会生成一个新的轴。它只是有一段代码,检查该位置是否已经有一个轴,如果已经有,则返回它(并使其成为当前轴)。(基本上,这是
plt.axes()
文档中的第三个要点,尽管您必须稍微阅读行与行之间的内容…)我将添加更多关于添加“未链接”x轴的详细信息。(基本上就像你说的:在顶部添加其他轴,然后隐藏其他脊椎。)不过,通常情况下,保持事物链接更容易。您甚至可以设置自动变换,以便(例如)一个以英尺为单位显示,另一个以米为单位显示。(你用“寄生轴”来做那个部分。它有点复杂。)这真是太神奇了。。。非常感谢。因此,基本上我认为我可以使用
twinx
twiny
来链接一组轴,而
添加_轴
来链接未链接的轴。“寄生虫轴”供以后使用。。。(我会把那个手册页放在手边)。
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()
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()