matplotlib: добавление вторых осей () с прозрачным фоном? - PullRequest
11 голосов
/ 14 октября 2011

Определить данные

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 Ответ

42 голосов
/ 14 октября 2011

На самом деле вы не добавляете новые оси.

Matplotlib обнаруживает, что в этой позиции уже есть график, и возвращает его вместо нового объекта осей.

(Проверьте это длясебя. ax и newax будут одним и тем же объектом.)

Вероятно, нет причины, по которой вы хотели бы, но вот как вы это сделаете.

(Кроме того, не вызывайте newax = plt.axes(), а затем вызывайте fig.add_subplot(newax) Вы делаете одно и то же дважды.)

Редактировать: С более новыми (> = 1.2, я думаю?) Версиями matplotlib вы можетевыполните то же самое, что и в примере ниже, используя label kwarg to 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

Конечно, это выглядит ужасно, но это то, что вы просите ...

Я предполагаюиз ваших предыдущих вопросов, которые вы просто хотите добавить вторую ось х?Если это так, то это совсем другое дело.

Если вы хотите, чтобы оси 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

Обратите внимание, что значения по оси Y для всего, что нанесено на newax, никогда не отображаются.

Если вы хотите, вы можете даже сделать этот шаг еще дальше и иметь независимые оси x и y (IЯ не совсем уверен, какой смысл, но это выглядит аккуратно ...):

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

Вы также можете просто добавить дополнительный позвоночник нанижняя часть сюжета.Иногда это проще, особенно если вы не хотите, чтобы тиканье или числовые значения были на нем.Не включайте слишком много моих собственных ответов, но вот пример этого здесь: Как мне нарисовать несколько осей X или Y в matplotlib?

Как последнее, убедитесь, чтопосмотрите примеры осей паразитов , если вы хотите, чтобы различные оси x и y были связаны определенным преобразованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...