Если в случае, если вторичная ось x будет иметь линейную шкалу, соответствие можно принудительно установить, установив для xlims
как соответствующее первое, так и последнее значения.
В случае, если нет такой линейной масштабирование возможно, обе оси должны иметь одинаковый логарифмический масштаб, а позиции тиков для вторичной оси должны быть установлены через значения первой Метки галочек, соответствующие этим позициям, должны быть установлены метками в x2
. Незначительные тики вспомогательной оси, которые были установлены с помощью логарифмической шкалы, должны быть удалены.
Обратите внимание, что главная ось x имеет только один основной тик и множество второстепенных тиков. При желании эти мелкие галочки могут также получить метку, используя set_minor_formatter(ticker.ScalarFormatter())
.
from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np
data = np.array([[1.84596E17, 100, 18.96342],
[2.27684E17, 102, 18.15215],
[2.80198E17, 104, 15.40415],
[3.44059E17, 106, 16.13399],
[4.21554E17, 108, 15.51298],
[5.15396E17, 110, 14.92131],
[6.28797E17, 112, 15.25483],
[7.65554E17, 114, 14.81549],
[9.30146E17, 116, 15.3397],
[1.12785E18, 118, 14.76562],
[1.36485E18, 120, 14.5095],
[1.64844E18, 122, 13.24967],
[1.98711E18, 124, 12.79743],
[2.39083E18, 126, 12.53556],
[2.87119E18, 128, 12.32063],
[3.44172E18, 130, 11.95121]])
x1 = data[:,0]
x2 = data[:,1].astype(int) # change to integer, so they get displayed as such
y = data[:,2]
fig, ax = plt.subplots()
ax.plot(x1, y, 'or-')
ax.set_xscale('log')
ax.set_xlabel('x1 (log scale)')
# ax.set_xlim(x1[0], x1[-1]) # optionally set tighter xlims
ax.xaxis.set_minor_formatter(ticker.ScalarFormatter()) # this shows the minor tick labels
ax2 = ax.twiny()
ax2.set_xlabel('x2')
ax2.set_xlim(ax.get_xlim()) # exactly the same limits for both axes
ax2.set_xscale('log')
ax2.set_xticks(x1) # set the tick positions via x1, but the labels via x2
ax2.set_xticklabels(x2)
ax2.xaxis.set_minor_locator(ticker.NullLocator()) # remove the old minor ticks
ax2.grid(True, axis='x', ls=':')
plt.tight_layout()
plt.show()