Matplotlib: вторичная ось со значениями, сопоставленными с первичной осью - PullRequest
1 голос
/ 29 апреля 2019

У меня есть график, показывающий x4 против y: graph

y - это журнал какой-то другой переменной, скажем, q (то есть y = log (q)) значение q - это то, что непрофессионал будетпонять при чтении этого графика.

Я хочу установить вторичную ось в правой части графика, где линии находятся в том же вертикальном положении, что и левая ось, но метка заменяется наэквивалентное значение q - то есть exp (y) - с точностью до 2 знаков после запятой.

Существует ли эффективный способ создания вторичной оси, которая выполняет это отображение из первичной оси y?

I 'м, используя pyplot из matplotlib.Некоторые примеры начального кода:

import numpy as np
import matplotlib.pyplot as plt

q = np.random.rand(100,)
y = np.log(q)
x4 = np.random.rand(100,)

plt.scatter(x4, y)

Я хочу добавить вторую ось, которая имеет те же вертикальные позиции и интервалы, что и основная ось, но метки заменяются на exp (y).Также добавьте метку оси "q".

Спасибо

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Мое предложение здесь состоит в том, чтобы использовать двойные оси и делиться ими с оригинальными осями, чтобы зафиксировать позиции тиков. Затем вы можете использовать FuncFormatter, чтобы дать галочкам правильные метки. Преимущество этого состоит в том, что вам не нужно фиксировать границы графика априори, и вы можете свободно масштабировать и перемещать внутри графика.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter


f = lambda q: np.log(q)
finv = lambda x: np.exp(x)

x = np.random.rand(100,)
y = f(np.random.rand(100,))


fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.get_shared_y_axes().join(ax,ax2)

ax.scatter(x, y)

ax2.yaxis.set_major_formatter(FuncFormatter(lambda x,pos: f"{finv(x):.2f}"))
plt.show()

enter image description here

1 голос
/ 29 апреля 2019

Вы можете использовать двойную ось. Идея следующая:

  • Создайте двойную ось и нанесите одинаковые данные на обе оси. Это позволит убедиться, что положения отметок являются осевыми пределами на обеих осях Y.
  • Получите тиковые метки, которые являются строками, преобразуйте их в целые числа и возьмите их экспоненту, используя np.exp(), округляя их до 2 десятичных знаков.
  • Присвойте новые метки правой оси y
  • Вам также необходимо убедиться, что обе оси имеют одинаковое количество тиков и одинаковые экстенты, как это предлагается @ImportanceOfBeingEarnest в комментариях ниже

import numpy as np; np.random.seed(123)
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

q = np.random.rand(100,)
y = np.log(q)
x4 = np.random.rand(100,)

ax.scatter(x4, y)
ax.set_xlabel('x4', fontsize=16)
ax.set_ylabel('y', fontsize=16)

ax2 = ax.twinx()
ax2.scatter(x4, y)

ax2.set_yticks(ax.get_yticks())
ax2.set_ylim(ax.get_ylim())
fig.canvas.draw()

labels = [int(i.get_text()[1:-1]) for i in ax2.get_yticklabels()]
labels_new = [np.round(np.exp(i), 2) for i in labels]

ax2.set_yticklabels(labels_new);
ax2.set_ylabel('q', fontsize=16)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...