Не удается отформатировать метку в двойной оси x в matplotlib.pyplot - PullRequest
1 голос
/ 07 июня 2019

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

import numpy as np
import matplotlib.pyplot as plt

imp1=np.arange(0,2,2/50)
imp1_pdf=np.arange(0,6,6/50)

fig1=plt.figure()
axs1=fig1.add_subplot(111)
axs1.set_xlim(0,2)
axs1.set_ylim(0,6.5)

axs2 = axs1.twiny()

axs1.plot(imp1,imp1_pdf)

new_tick_locations=axs1.get_xticks()

axs2.set_xticks(new_tick_locations)
axs2.set_xticklabels(new_tick_locations/1000)
axs2.axes.ticklabel_format(axis='x',style='sci',scilimits=(0,0))

axs1.grid(b=True, which='major',linestyle='-')
fig1.tight_layout()
fig1.savefig('tickformat.png',dpi=600)

Без форматирования метки, фигура выглядит следующим образом: enter image description here

Но когда я пытаюсь отформатировать верхнюю ось x, возникает ошибка, подобная этой:

AttributeError: Этот метод работает только с ScalarFormatter.

Если я использую альтернативный метод, который должен использовать FormatStrFormatter

from matplotlib.ticker import FormatStrFormatter

axs2.xaxis.set_major_formatter(FormatStrFormatter('%.1e'))

Значение верхней оси x станет таким же, как и значение нижней оси x, например:enter image description here

Может кто-нибудь сказать мне, как решить эту проблему, пожалуйста?

1 Ответ

0 голосов
/ 07 июня 2019

Проблема в том, что вы пытаетесь изменить пользовательские метки, которые представляют собой строки, которые вы определили (new_tick_locations/1000).Действительные значения на двойной оси такие же , что и на нижней оси.Вы просто изменяете метки.Один из способов добиться этого - создать измененные метки в научном формате, используя Decimal, а затем назначить их верхней оси x.Затем вы можете выбрать любой коэффициент вместо 1000, который вы хотите отобразить

import numpy as np
from decimal import Decimal
import matplotlib.pyplot as plt

imp1=np.arange(0,2,2/50)
imp1_pdf=np.arange(0,6,6/50)

fig1=plt.figure()
axs1=fig1.add_subplot(111)
axs1.set_xlim(0,2)
axs1.set_ylim(0,6.5)

axs2 = axs1.twiny()
axs1.plot(imp1,imp1_pdf)

new_tick_locations=axs1.get_xticks()
ticks = ['%.2E' % Decimal(i) for i in (new_tick_locations/1000)] # <-- make new ticks
axs2.set_xticks(new_tick_locations)
axs2.set_xticklabels(ticks, rotation = 45) # <-- assign new ticks and rotate them

axs1.grid(b=True, which='major',linestyle='-')
fig1.tight_layout()

enter image description here

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