Как я могу «подделать» тики оси в matplotlib? - PullRequest
0 голосов
/ 07 января 2019

У меня есть график в matplotlib, который выглядит так: enter image description here

У меня также есть другой сюжет, который выглядит так: enter image description here

Я хочу создать сюжет, который выглядит следующим образом: enter image description here

То есть я хочу, чтобы точки данных находились точно там, где они находятся на первом графике, но заменили отметки и метки оси x на маркеры со второго графика. (В этом случае они генерируются с plt.xscale('symlog').) Я не могу найти простой способ сделать это. Есть ли один?

Примечание: на самом деле это не должно говорить, но сюжет в этом вопросе не является моим реальным сюжетом, и у меня есть причина хотеть сделать это. Я рад уточнить вопрос, который задаю, но не думаю, что полезно спрашивать подробности того, зачем мне это нужно. Вопрос в том, как сделать то, что я просил, и ответы по теме приветствуются.

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Если у кого-то возникнет такая же проблема в будущем, вот решение, которое работает. Я не знаю, лучший ли это способ.

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

# use ax1 to plot the data

ax1.axes("off")
ax2 = fig.add_axes(ax1.get_position())
ax2.patch.set_alpha(0)

# then do whatever you want to set up the axes of ax2. In my case:

ax1_xlim = ax1.get_xlim()
ax2.set_xlim([-np.power(10,-ax1_xlim[0]), np.power(10,ax1_xlim[1])])

Я не понимаю, почему все комментарии и другие ответы были так сосредоточены на «почему» этой простой задачи. Я надеюсь, что это будет полезно для других, несмотря на весь шум.

0 голосов
/ 07 января 2019

ImportanceOfBeingErnest сказал, что это проблема масштабирования, и я согласен с ним.

Общий принцип

Из того, что я понял, вы пытаетесь сделать что-то вроде:

  1. График вашей функции с единицей 'vanilla' => y = f (x)
  2. Выразите ось x в другой единице => x [unit] = x '[deg]
  3. График вашей функции с новым модулем => y = f (x ')
  4. Выберите хороший xlim, чтобы точка находилась в «том же месте», что и раньше (см. ImportanceOfBeingErnest ответ)

NB : вы можете написать x '= g (x) другую функцию, а затем y = f (g (x)) Все, что вам нужно знать - это функция g, чтобы изменить масштаб.

Повторяю, Я вижу эту проблему как проблему смены модуля . Таким образом, ответ зависит от проблемы, ее природы, ее параметров. Это то, что скрыто за этой функцией g.

Почти ответ вам нужен

В вашем случае, согласно графику, который вы показали, я могу дать вам приблизительный ответ:

x '= 10 * (x - 0,5)

np.semilogx (х», у)

0,5, потому что новый 0, кажется, там, где у вас было 0,5. Я вычленяю, чтобы центрировать новые точки в 0,5. 10 * потому что вы преобразуете 0,1 в 10 ^ 0.

0 голосов
/ 07 января 2019

Мне кажется, что этот вопрос требует обходного пути, чтобы избежать преобразования данных в желаемый масштаб. Это должно быть довольно просто, применяя обратную функцию к данным перед построением графика. Тем не менее, в вопросе недостаточно информации о том, какой будет проблема для такого решения.


Поэтому можно только ответить на вопрос таким, какой он есть; это в основном приводит к созданию совершенно не связанной оси.

import numpy as np
import matplotlib.pyplot as plt

x,y = np.random.rand(2,30)

fig, ax = plt.subplots()
ax.plot(x,y, ls="", marker="+")

ax2 = ax.twiny()
ax2.set_xscale("symlog")
ax2.tick_params(axis="x", which="both", bottom=True, labelbottom=True, 
                top=False, labeltop=False)
ax.tick_params(axis="x", bottom=False, labelbottom=False)
ax2.set_xlim(-50,50)

plt.show()

enter image description here

Здесь пределы x выбраны произвольно. Проблема будет заключаться в том, чтобы связать ограничения с исходными данными. Из-за 5-процентного запаса по умолчанию с обеих сторон это, как правило, не будет тривиальным, и любая функция, выполняющая эту задачу, станет намного более сложной, чем функция, вычисляющая обратное преобразование на исходных данных.

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