Как добавить вторую ось x в matplotlib
У меня очень простой вопрос. Мне нужно иметь вторую ось x на моем графике, и я хочу, чтобы эта ось имела определенное количество тиков, которые соответствуют определенному положению первой оси.
Попробуйте пример. Здесь я рисую массу темной материи как функцию коэффициента расширения, определяемую как 1/(1 + z), которая колеблется от 0 до 1.
semilogy(1/(1+z),mass_acc_massive,'-',label='DM')
xlim(0,1)
ylim(1e8,5e12)
Я хотел бы иметь еще одну ось x в верхней части моего графика, показывая соответствующий z для некоторых значений коэффициента расширения. Это возможно? Если да, то как я могу получить xtics ax
Ответы
Ответ 1
Я беру реплику из комментариев в ответе @Dhara, похоже, что вы хотите установить список new_tick_locations
функцией от старой оси x до новой оси x. tick_function
ниже берет в себе несколько точек массива, отображает их в новое значение и форматирует их:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
X = np.linspace(0,1,1000)
Y = np.cos(X*20)
ax1.plot(X,Y)
ax1.set_xlabel(r"Original x-axis: $X$")
new_tick_locations = np.array([.2, .5, .9])
def tick_function(X):
V = 1/(1+X)
return ["%.3f" % z for z in V]
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(new_tick_locations)
ax2.set_xticklabels(tick_function(new_tick_locations))
ax2.set_xlabel(r"Modified x-axis: $1/(1+X)$")
plt.show()
![enter image description here]()
Ответ 2
Вы можете использовать twiny, чтобы создать 2 шкалы по оси x. Например:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
ax1.plot(range(60), a)
ax2.plot(range(100), np.ones(100)) # Create a dummy plot
ax2.cla()
plt.show()
Ссылка: http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales
Вывод:
![enter image description here]()
Ответ 3
Отвечая на ваш вопрос в ответах с ответами Дхара: "Я бы хотел, чтобы на второй оси x эти тики: (7,8,99), соответствующие положению оси x 10, 30, 40. Возможно ли это каким-то образом?"
Да, это так.
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
ax1.plot(range(60), a)
ax1.set_xlim(0, 60)
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax2 = ax1.twiny()
ax2.set_xlabel("x-transformed")
ax2.set_xlim(0, 60)
ax2.set_xticks([10, 30, 40])
ax2.set_xticklabels(['7','8','99'])
plt.show()
Вы получите:
![enter image description here]()
Ответ 4
Если вы хотите, чтобы ваша верхняя ось была функцией значений галактики нижней оси:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax1 = fig.add_subplot(111)
ax1.plot(range(5), range(5))
ax1.grid(True)
ax2 = ax1.twiny()
ax1Xs = ax1.get_xticks()
ax2Xs = []
for X in ax1Xs:
ax2Xs.append(X * 2)
ax2.set_xticks(ax1Xs)
ax2.set_xbound(ax1.get_xbound())
ax2.set_xticklabels(ax2Xs)
title = ax1.set_title("Upper x-axis ticks are lower x-axis ticks doubled!")
title.set_y(1.1)
fig.subplots_adjust(top=0.85)
fig.savefig("1.png")
дает:
![enter image description here]()
Ответ 5
Я вынужден опубликовать это как ответ вместо комментария из-за низкой репутации.
У меня была аналогичная проблема с Маттео. Разница заключалась в том, что у меня не было карты с моей первой оси x до моей второй оси x, только сами значения x. Поэтому я хотел установить данные на моей второй оси x напрямую, а не на тики, однако нет axes.set_xdata
. Я смог использовать ответ Dhara, чтобы сделать это с модификацией:
ax2.lines = []
вместо использования:
ax2.cla()
При использовании также очищается мой график от ax1
.