Пользовательский регулярный масштаб (pyplot) - PullRequest
0 голосов
/ 03 августа 2020

Я хотел бы знать, знали ли некоторые из вас, как сделать нестандартный масштаб на pyplot.

Вот мой базовый c скрипт:

import matplotlib.pyplot as plt
fig, ax= plt.subplots()
ax.set_yticks([0, 5, 27, 40])

Я хотел бы чтобы на моей оси Y было то же пространство между 0 и 5, затем такое же пространство между 5 и 27, а затем то же самое между 27 и 40 ....

Кто-нибудь найдет решение?

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

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Один из возможных подходов - определить ad ho c класс нормализации

In [27]: class normalize():
    ...:     def __init__(self, positions):
    ...:         self.positions = positions.sort() or positions
    ...:         self.outputs = np.arange(len(positions))/(len(positions)-1)
    ...:     def __call__(self, x):
    ...:         return np.interp(x, self.positions, self.outputs, np.nan, np.nan)

и быть осторожным при определении y позвоночника (в дальнейшем для ради примера я собираюсь построить график y = 20 (x + x²) )

In [28]: positions = [0, 5, 27, 40]
    ...: f = normalize(positions)
    ...: lp = len(positions)
    ...:
    ...: fig, ax= plt.subplots()
    ...:
    ...: ax.set_ylim(-0.05, 1.05) # standard Matplotlib margins
    ...: ax.set_yticks(np.arange(0,lp)/(lp-1))
    ...: ax.set_yticklabels((repr(p) for p in positions))
    ...:
    ...: x = np.linspace(0, 1, 101) ; y=20*x*(1+x)
    ...:
    ...: plt.plot(x, f(y))
    ...: plt.grid()

мой сюжет

0 голосов
/ 03 августа 2020

Вы можете определить свои точки сетки и интерполировать на них данные. Начните с:

import numpy as np
x_ticks = np.array([0, 5, 27, 40])
x_reg = np.arange(len(x_ticks))

Теперь предположим, что ваши фактические данные y определены в точках x. Вы можете преобразовать значения x, а затем построить:

x_plot = np.interp(x, x_ticks, x_reg)
plt.plot(x_plot, y)
...