2016-03-26 2 views
0

Обе оси x находятся в масштабе шкалы. Верхняя ось x является функцией нижней оси (в данном примере - квадрат).Как отформатировать двойные логарифмические метки оси x x, чтобы они отображались как десять?

В то время как нижняя ось клещ метка автоматически отформатирована по степеням десять, верхняя ось имеет разное форматирования по умолчанию (научная нотация):

enter image description here

Как это исправить?

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twiny() 

x = np.logspace(-9,0,10) 
x2 = x**2 
new_tick_locations = x[3:-3] 
new_tick_labels = x2[3:-3] 
y = np.ones(np.size(x)) 

ax1.semilogx(x,y) 
plt.grid(True) 
ax1.set_xlabel(r"Original x-axis: $X$") 

ax2.set_xscale('log') 
ax2.set_xlim(ax1.get_xlim()) 
ax2.set_xticks(new_tick_locations) 
ax2.set_xticklabels(new_tick_labels) 
ax2.set_xlabel(r"Modified x-axis: $X^2$") 
plt.show() 

ответ

0

Есть как минимум два способа исправить это:

  1. Формат вашей new_tick_labels перед назначением их в ax2.set_xticklabels()

  2. Использование FuncFormater сделать как блок преобразования и форматирования без необходимости вызова ax2.set_xticklabels()

Для перехода 1-го, как вам нужно будет заменить эту строку:

ax2.set_xticklabels(new_tick_labels) 

с этим блоком:

new_tick_labels = ['$\mathdefault{10^{%i}}$' % np.log10(l) 
        for l in new_tick_labels] 
ax2.set_xticklabels(new_tick_labels) 

Чтобы получить пользу от FuncFormater заменить ту же линию:

from matplotlib.ticker import FuncFormatter 
ax2.xaxis.set_major_formatter(
    FuncFormatter(lambda x, p: 
     '$\mathdefault{10^{%i}}$' % np.log10(x**2))) 

Вы также может упасть new_tick_labels = x2[3:-3] если вы используете FuncFormater.

Смежные вопросы