Python — график со вторичной осью — функция с 2 переменными

#python #matplotlib

Вопрос:

Я быстро просмотрел старые вопросы, но не нашел этого конкретного. Извините, если это дубликат!

Я пытаюсь построить вторичную ось с помощью ax.secondary_yaxis (), в которой функция, соединяющая две оси, включает дополнительную переменную. Это мой пример:

     x = np.linspace(0, 50, 100)
    y = np.linspace(220, 273, 100)
    k = np.linspace(-10, 10, 100)

    def y_to_y2(y):
        return y * k
    def y2_to_y(y2):
        return y2 / k

    fig, ax = plt.subplots()
    ax2 = ax.secondary_yaxis("right", functions=(y_to_y2, y2_to_y))
    ax.plot(x, y)
 

Но я получаю эту ошибку:

     ValueError: operands could not be broadcast together with shapes (2,) (100,)
 

Большое спасибо за вашу помощь и предложения!

Комментарии:

1. Y внутри y_to_y2 -это не тот же самый y, который определен в начале вашего кода. Попробуйте добавить инструкцию print(y) внутри функции. Это список второго размера, отсюда и ошибка. Взгляните на примеры в документах matplotlib secondary_yaxis, чтобы понять, какие преобразования это может сделать.

2. кроме того, именно по этой причине важно опубликовать (и прочитать) полный отчет о вашей ошибке

Ответ №1:

Как указано в комментариях ax.secondary_yaxis , не удается обработать вывод вашей функции, представляющей собой массив из n элементов. Третий пример здесь предоставляет разумный способ решения этой проблемы с помощью функции интерполяции numpy. Ваш конкретный случай можно было бы решить, сделав что-то вроде этого:

 x = np.linspace(0, 50, 100)
y = np.linspace(220, 273, 100)
k = np.linspace(-10, 10, 200)

yold = np.linspace(210, 283, 200)
ynew = yold*k

def forward(y):
    return np.interp(y, yold, ynew)

def inverse(y):
    return np.interp(y, ynew, yold)

fig, ax = plt.subplots()
ax.plot(x, y)
ax2 = ax.secondary_yaxis("right", functions=(forward, inverse))
 

Вот результат:
введите описание изображения здесь

Пожалуйста, обратите внимание, что, как объяснено в примере, функции отображения должны быть определены за пределами номинальных границ участка.