2017-01-25 8 views
1

Используя Python, я пытаюсь получить метки меток оси, которые охватывают много порядков, которые будут отображаться в научной нотации, которые должны быть относительно прямолинейными: ax1.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2E')) (полный код ниже)matplotlib format_major_ticks не извлекает метки меток

, но это, кажется, игнорировать клеща метки, которые ранее были установлены, и вместо форматов range(len(axis_vector)) в научной записи, как показано на рисунке 1. правильные метки клеща, но не отображается в научной записи (не используя ax1.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2E'))), показаны в Рисунок 2.

Рисунок 1:

Figure 1

Рисунок 2:

Figure 2

Как я могу получить его, чтобы отобразить фактический клещ метку в научной нотации?

Вот код со случайно сгенерированных данных образца:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.colors import LogNorm 
import matplotlib.ticker as mtick 

y = np.array([1E0,5E0,1E1,5E1,1E2,5E2,1E3,5E3,1E4,5e4,1E5,5E5,1E6,5E5,1E7,5E7]) 
x = np.arange(0.2,3.2,0.2) 

### generate sample data with random powers of 10 
data = np.zeros(240) 

for i in range(len(data)): 

    power = np.round(np.random.rand()*10) 

    data[i] = 10**power  

image = data.reshape((16,15)) 

### Plotting 
fig = plt.figure(figsize=(6,6)) 
ax1 = fig.add_subplot(111) 

im = ax1.imshow(image, interpolation='none',norm=LogNorm(vmin=(np.min(image)),vmax=(np.max(image)))) 

ax1.set_xticks(np.arange(len(x)), minor=False) 
ax1.set_xticklabels(x, minor=False) 
ax1.set_xlabel('x-axis') 

ax1.set_yticks(np.arange(len(y)), minor=False) 
ax1.set_yticklabels(y, minor=False) 
ax1.set_ylabel('y-axis') 

ax1.tick_params(labelbottom='on',labeltop='off', labelleft='on',labelright='off', 
    top='off', right='off') 

ax1.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2E')) 

axcolor = fig.add_axes([0.9, 0.12, 0.03, 0.79]) 
t = np.logspace(1,11,num=12) 
fig.colorbar(im, cax=axcolor, ticks=t, format='%.3E') 

ответ

0

Проблема в том, что клещ форматировщик работает непосредственно на клеща значения не предыдущие этикетки. В вашем случае значение клеща у находится в np.arange(len(x))

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

labels = [str(x) for x in y] 

Что вы хотите сделать, это вместо того, чтобы создавать свои собственные (отформатированный) ytick ярлыки и назначить тех, кто использует set_yticklabels

labels = ['%.2E' % x for x in y] 
ax1.set_yticklabels(labels) 

Если вы хотите быть фантазии, вы можете использовать свой FormatStrFormatter объект, чтобы сделать это, а также

formatter = mtick.FormatStrFormatter('%.2E') 
labels = [formatter(x) for x in y] 
ax1.set_yticklabels(labels) 

enter image description here