Несколько масштабов matplotlib для одного и того же набора данных - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь построить график скорости ветра в км / ч. Слева у меня шкала в км / ч. Теперь я хочу добавить шкалу в bft справа от графика. Шкала Bft не является линейной. Я хотел бы (вручную) добавить числа bft (0-12), чтобы указать c скорость ветра в км / ч. например. на той же высоте, что и 10,2 км / ч (левая шкала), я хочу, чтобы число 2 было написано на правой шкале (2 футы = 7,4-13 км / ч)

знает ли кто-нибудь, есть ли способ добавить такую ​​нелинейную шкалу вручную?

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

текущий код этого визуального примера:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from datetime import datetime
from datetime import timedelta
from os import path
from os import system
import sys
from math import exp

#data processing
print("data-ready")
from matplotlib import use
use('Agg')
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
print("plotlib ready")
plt.figure(1)
#multiple subplots for temprature, pressure, wind, humidity
#only wind on axs[1] is interesting here
fig, axs = plt.subplots(4, sharex=True, sharey=False)
axs[1].plot(xg, gusts,'bo')
axs[1].plot(x, winds,'black')
fig.set_figwidth(9)
fig.set_figheight(7)
axs[1].grid()
axs[1].minorticks_on()
axs[1].xaxis.set_minor_locator(mdates.HourLocator())
axs[1].grid(which='major', linestyle='-', color='lightgray')
axs[1].grid(which='minor', linestyle=':', color='lightgray')
axs[1].set_ylabel(u'Windstärke (km/h)\n[Punkte=Böen]')
axs12=axs[1]
ylim=(axs12.get_ylim())
axs12.axhspan(0, 1.85, facecolor='#00ffff', alpha=0.5)
axs12.axhspan(1.85, 7.41, facecolor='#00ff40', alpha=0.5)
axs12.axhspan(7.41, 12.96, facecolor='#80ff00', alpha=0.5)
axs12.axhspan(12.96, 20.37, facecolor='#ffff00', alpha=0.5)
axs12.axhspan(20.37, 29.36, facecolor='#ffc000', alpha=0.5)
axs12.axhspan(29.36, 40.74, facecolor='#ff6000', alpha=0.5)
axs12.axhspan(40.74, 51.86, facecolor='#ff0000', alpha=0.5)
axs12.axhspan(51.86, 62.97, facecolor='#ff0040', alpha=0.5)
axs12.axhspan(62.97, 75.93, facecolor='#ff0080', alpha=0.5)
axs12.axhspan(75.93, 140, facecolor='#ff00ff', alpha=0.5)
axs12.set_ylim(ylim)
#axs[x]...
print("sving")
plt.savefig("some_private_path/mfcPlot.png",bbox_inches = 'tight',pad_inches = 0)
print("done")

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Не уверен, что это правильный ответ, но не могу написать его как комментарий. При необходимости отменим.

Мое предложение было бы примерно таким:

yticks_val = ax.get_yticks(self, minor=False)

btf_scale_labels = someConversionFunction(yticks_val)

ax1 = ax.twinx()

ytick(yticks_val, btf_scale_labels)

def someConversionFunction(kmh_values)
    #do something
    return btf_values


EDIT

Попробовал поискать в Google. Следуя странице википедии Бофорта , это должно сделать трюк преобразования:


kmh_values=[0,10,24]
def kmhToBft(np.array(kmh_values)):
    import numpy as np
    kmh_lim = np.array([2,5,11,19,28,38,49,61,74,88,102,117,10000])
    bft_scale = np.arange(13)
    bft_level = (kmh_values[:, None] <= kmh_lim)
    bft_values = np.nanmin(
                 np.where(bft_level, bft_scale, np.nan), axis=1)
    return bft_values
0 голосов
/ 25 мая 2020

Возможно, я сам нашел решение:

matplotlib.axes.Axes.secondary_yaxis

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

Изменить :

Я не тестировал его, как другой ответ был успешным для моего варианта использования (посмотрите комментарии)

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