На самом деле вы не добавляете новые оси.
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()
Конечно, это выглядит ужасно, но это то, что вы просите ...
Я предполагаюиз ваших предыдущих вопросов, которые вы просто хотите добавить вторую ось х?Если это так, то это совсем другое дело.
Если вы хотите, чтобы оси 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()
Обратите внимание, что значения по оси 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()
Вы также можете просто добавить дополнительный позвоночник нанижняя часть сюжета.Иногда это проще, особенно если вы не хотите, чтобы тиканье или числовые значения были на нем.Не включайте слишком много моих собственных ответов, но вот пример этого здесь: Как мне нарисовать несколько осей X или Y в matplotlib?
Как последнее, убедитесь, чтопосмотрите примеры осей паразитов , если вы хотите, чтобы различные оси x и y были связаны определенным преобразованием.