Как добавить вторую ось 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
5 ответов:
Я беру реплику из комментариев в ответе @Dhara, похоже, вы хотите установить список
new_tick_locations
С помощью функции от старой оси x к новой оси X. Элементtick_function
ниже принимает в numpy массив точек, сопоставляет их с новым значением и форматирует их: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+X)$") plt.show()
вы можете использовать twiny для создания 2-х осевых шкал. Например:
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()
Ref:http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales
выход:
отвечая на ваш вопрос в комментариях к ответу Дхары:"Я хотел бы на второй оси 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()
вы получите:
Если вы хотите, чтобы ваша верхняя ось была функцией нижней оси тиковых значений:
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")
выдает:
Я вынужден опубликовать это в качестве ответа вместо комментария из-за низкой репутации. У меня была аналогичная проблема с Маттео. Разница в том, что у меня не было карты от моей первой оси x до моей второй оси x, только сами значения X. Поэтому я хотел установить данные на моей второй оси x напрямую, а не тики, однако, нет
axes.set_xdata
. Я смог использовать ответ Дхары, чтобы сделать это с модификацией:ax2.lines = []
вместо:
ax2.cla()
когда в пользе также очистил мой участок от
ax1
.