pgfplots: вторая ось с другим масштабированием/трансформация координат x

pgfplots: вторая ось с другим масштабированием/трансформация координат x

Я пытаюсь сфабриковать так называемыйАррениус-графикв pgfplots. По сути, это полулогарифмический (ось Y) график, где температурно-зависимая функция отображается в зависимости от 1/kB*T (где kB —Постоянная Больцмана) Это пока работает, но, например, 1600°C соответствует примерно 6,2 1/эВ (обратная величинаэлектрон-вольт)

С научной точки зрения это верно, но никто не может придать этому числу физический смысл (я не могу установить свою печь на 6,2 1/эВ или в докладе, где слайды видны только несколько секунд, это может сбить с толку слушателя). Поэтому я хотел добавить вторую ось x к графику, показывающему температуру в градусах Цельсия. Я думал о возможности pgfplots преобразовывать координаты, но у меня не получается решить эту проблему.

Ниже приведен MWE того, что я попробовал. Должно быть, в моем мыслительном процессе о преобразовании координат есть какая-то ошибка, но я не могу ее понять. Конечные точки графика совпадают, но между ними отображение немного смещено. Может кто-нибудь подсказать, как это исправить?

\documentclass[tikz=true]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{mathptmx}
\usepackage{siunitx}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
\begin{semilogyaxis}[
axis x line* = top,
axis y line* = left,
xlabel={$\frac{1}{k_B \cdot T} / \si[per-mode=reciprocal]{\per\electronvolt}$},
ylabel={$k$},
]
\addplot+[x = kb, y = k] table { 
    kb      T       k
    7.61876 1250    3.98E-17
    7.37661 1300    1.68E-17
    7.23857 1330    1.00E-17
    7.14938 1350    7.09E-18
    7.10560 1360    5.97E-18
    7.06236 1370    5.03E-18
    7.01964 1380    4.23E-18
    6.97743 1390    3.56E-18
    6.93573 1400    3.00E-18
    6.89452 1410    2.52E-18
    6.85380 1420    2.12E-18
    6.83362 1425    1.95E-18
    6.77379 1440    1.50E-18
    6.69562 1460    1.07E-18
    6.61924 1480    7.55E-19
    6.54458 1500    5.35E-19
    6.45359 1525    3.48E-19
    6.36509 1550    2.26E-19
    6.19519 1600    9.54E-20
    };
\end{semilogyaxis}

% % extra x axis
\begin{semilogyaxis}[
    x dir = reverse,
    axis y line* = right,
    axis x line* = bottom,
    xlabel={$T / \si{\celsius}$},
    x coord trafo/.code={\pgfmathparse{(1/(#1*8.617333262145E-05)-273.15)}},
    ]
\addplot+[x = T, y = k] table { 
    kb      T       k
    7.61876 1250    3.98E-17
    7.37661 1300    1.68E-17
    7.23857 1330    1.00E-17
    7.14938 1350    7.09E-18
    7.10560 1360    5.97E-18
    7.06236 1370    5.03E-18
    7.01964 1380    4.23E-18
    6.97743 1390    3.56E-18
    6.93573 1400    3.00E-18
    6.89452 1410    2.52E-18
    6.85380 1420    2.12E-18
    6.83362 1425    1.95E-18
    6.77379 1440    1.50E-18
    6.69562 1460    1.07E-18
    6.61924 1480    7.55E-19
    6.54458 1500    5.35E-19
    6.45359 1525    3.48E-19
    6.36509 1550    2.26E-19
    6.19519 1600    9.54E-20
    };
    \end{semilogyaxis}
%
\end{tikzpicture}
\end{document}

Таблица представляет собой фиктивные данные, которые рассчитываются следующим образом: T задана, kB рассчитывается из 1/kB*T, а k — воображаемая константа скорости, рассчитанная по уравнению Аррениуса.

решение1

Это не 100% то, что вы ищете, но это, по крайней мере, то, что язнатьправильно. Я думаю, вы сможете сделать необходимые изменения самостоятельно отсюда.

% used PGFPlots v1.16
\documentclass[border=5pt]{standalone}
\usepackage{xfp}        % <-- needed for accuracy
\usepackage{siunitx}
\usepackage{pgfplotstable}
    \pgfplotsset{compat=1.16}
    \pgfplotstableread{
        kb      T       k
        7.61876 1250    3.98E-17
        7.37661 1300    1.68E-17
        7.23857 1330    1.00E-17
        7.14938 1350    7.09E-18
        7.10560 1360    5.97E-18
        7.06236 1370    5.03E-18
        7.01964 1380    4.23E-18
        6.97743 1390    3.56E-18
        6.93573 1400    3.00E-18
        6.89452 1410    2.52E-18
        6.85380 1420    2.12E-18
        6.83362 1425    1.95E-18
        6.77379 1440    1.50E-18
        6.69562 1460    1.07E-18
        6.61924 1480    7.55E-19
        6.54458 1500    5.35E-19
        6.45359 1525    3.48E-19
        6.36509 1550    2.26E-19
        6.19519 1600    9.54E-20
    }{\data}
\begin{document}
\begin{tikzpicture}
    \begin{semilogyaxis}[
        axis lines*=left,
        xlabel={$\frac{\SI{1000}{\kelvin}}{T}$},
        ylabel={$k$},
    ]
        % please note that table options have to be given *after* the
        % table keyword. Otherwise they will not be applied
        \addplot table [
            x expr={1000/\thisrow{T}},
            y=k,
        ] {\data};
    \end{semilogyaxis}

    % extra x axis
    \begin{semilogyaxis}[
        axis lines*=right,
        xlabel={$T / \si{\kelvin}$},
        % avoid scaling (to avoid unexpected result)
        scaled ticks=false,
        % state values which should be shown on axis
        xtick={1250,1300,1350,1400,1500,1600},
        % perform coordinate transformation
        % to ensure right results (accuracy), use the `\fpeval` command
        % from the `xfp` package
        % (compare results when not using it. This will be way off for high T)
        x coord trafo/.code={\pgfmathparse{\fpeval{1/(#1)}}},
        x coord inv trafo/.code={\pgfmathparse{\fpeval{1/(#1)}}},
    ]
        \addplot+ [red] table [
            x=T,
            y=k,
        ] {\data};
    \end{semilogyaxis}
\end{tikzpicture}
\end{document}

изображение, показывающее результат кода выше

Связанный контент