Pyplot / Matplotlib: как получить сжатую ось Y - PullRequest
0 голосов
/ 11 мая 2018

Я использую pyplot для создания климографа, основанного на визуализации Уолтера / Лиета.

Climograph Walter / Lieth

Еще один Climograph от Walter / Lieth

Как видно на изображениях (ссылкивыше), правая ось Y сжимается, начиная со значения 100. Их визуальное расстояние уменьшается, а их числовые интервалы становятся больше.

Я не могу понять, как этого добиться в pyplot.Я знаю, как установить значения тиков для создания собственного масштаба, но, конечно, они всегда равноудалены.Как вы можете видеть на моем графике, построенное пространство на правой оси Y соответствует интервалу значений: My plot

Может быть, кто-то может дать подсказку о том, как добиться эффекта, показанного в двух ссылкахвыше.

Ура!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Ответ от OP, отредактированный из их вопроса:

Решение Вот пример решения, основанного на ответе Аттерсона.Функция масштабирования была взята из этого ответа.

from matplotlib import pyplot as plt

def scale(val, src, dst):
        """
        Scale the given value from the scale of src to the scale of dst.
        """
        return ((val - src[0]) / (src[1]-src[0])) * (dst[1]-dst[0]) + dst[0]

# Actual data
data = [20, 50, 100, 250, 600, 200, 150, 100, 40, 30, 25, 20]

source_scale = (100, 600) # Scale values between 100 and 600
destination_scale = (100, 150) # to a scale between 100 and 150

# Apply scale to all items of data that are above or equal to 100
data_scaled = [x if x < 100 else scale(x, source_scale, destination_scale) for x in data]

# Set up a simple plot
fig = plt.figure()
ax = plt.Axes(fig, [0.,0.,1.,1.])
fig.add_axes(ax)

# Set the y-ticks to a custom scale
ax.set_yticks([0,20,40,60,80,100,110,120,130,140,150])
ax.set_ylim(0, 150)
# Set the labels to the actual values
ax.set_yticklabels(["0","20","40","60","80","100","200","300","400","500","600"])

ax.plot(data_scaled)

Result

0 голосов
/ 11 мая 2018

Пример для вас:

import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_xlim([-10, 10]) #whatever, optional
axes.set_ylim([0, 1.0]) # whatever, optional
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
axes.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,150,200,300])
plt.plot(x, norm.pdf(x)) #random filler
plt.plot(x, norm.pdf(x, 70.0, 0.1)) #another absolutely random filler
plt.show()

Мой пример показывает только то, как вы можете настроить координаты Y, как вы и хотели знать.Извините за то, что не был слишком полезным, по-видимому.Я не понимаю, понижающий голос вообще.Наверное, будут лучшие ответы.

Для фактического сжатия выборок (данных) есть несколько способов:

...