Как установить положение xtick для вторичной оси в matplotlib? - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу создать вторичный xaxis вверху, который имеет обратную связь с основным xaxis внизу. Я следовал официальному уроку здесь и получил следующие коды:

def forward(x):
    return 10/x

def backward(y):
    return 10/y

fig, ax = plt.subplots()
ax.set_xlim([0.14, 1.4])
secax = ax.secondary_xaxis('top', functions=(forward, backward))
secax.set_xticks(np.array([10,20,40,70]))  # does not work!
plt.show()

Проблема в том, что метки вверху не в нужном месте. Они сгруппированы слева из-за примененной обратной функции. Как вручную установить положение клавиш? (например, в 10,20,40,70)

Редактировать: Просто, чтобы сделать это более ясным, отметки находятся в нужном месте, но слишком много отметок, как показано на рисунке. В этом случае мне нужны тики только на 10, 20, 40, 70 (я не хочу тики на 30, 50 и 60, так как мы не можем четко видеть все номера тиков) enter image description here

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Я считаю, что вы либо пропустили оператор импорта для numpy, либо вам нужно обновить ваш файл matplotlib. Ниже у меня отлично работает -

import matplotlib.pyplot as plt
import numpy as np

def forward(x):
    return 10/x

def backward(y):
    return 10/y

fig, ax = plt.subplots()
ax.set_xlim([0.14, 1.4])
secax = ax.secondary_xaxis('top', functions=(forward, backward))
secax.set_xticks(np.array([10,20,40,70]))  # does not work!
plt.show()

Проверьте свою версию -

import matplotlib
print (matplotlib.__version__)

Если выше не печатать 3.2.1. попробуйте ниже -

 pip install matplotlib==3.2.1

enter image description here

0 голосов
/ 23 апреля 2020

Непонятно, чего вы хотите достичь.

Если вы хотите, чтобы наверху были линейные отношения, это может быть уместно:

import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.set_xlim([0.14, 1.4])
secax = ax.secondary_xaxis('top', functions=(lambda x: 77 - 50 * x,
                                             lambda y: (77 - y) / 50))
secax.set_xticks(np.array([10, 20, 40, 70]))
plt.show()

enter image description here

...