2015-06-10 2 views
5

Я пытаюсь построить 3 подзаголовка без пробелов между ними. Пометка по оси y по умолчанию использует масштаб, отображаемый в верхнем правом углу оси y (1e-8 в приведенном ниже примере), что было бы неплохо, за исключением двух нижних графиков, которые перекрываются с приведенным выше графиком. Кто-нибудь знает, как это исправить? Ниже приведен небольшой пример.Matplotlib subplot y-scale scale overlaps with plot выше

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
from matplotlib.ticker import MaxNLocator 

x = np.arange(0,200) 
y = np.random.rand(200) * 10e-8 


fig = plt.figure(figsize=(10,15)) 
gs1 = gridspec.GridSpec(3, 3) 
gs1.update(left=0.1, right=0.9, bottom=0.5, hspace=0.0) 
ax0a = plt.subplot(gs1[0, :]) 
ax0b = plt.subplot(gs1[1, :]) 
ax0c = plt.subplot(gs1[2, :]) 


ax0a.set_xticklabels([]) 
ax0b.set_xticklabels([]) 

ax0a.plot(x,y) 
nbins = len(ax0a.get_xticklabels()) 
ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0b.plot(x,y) 
ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0c.plot(x,y) 
ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 

plot

так одно решение заключается в использовании mtick,

import matplotlib.ticker as mtick 

ax0a.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) 
ax0b.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) 
ax0c.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.1e')) 

, но я бы предпочел, чтобы быть в состоянии сдвинуть шкалу влево, так что вне оси, если это возможно.

+0

Не могли бы вы поделить ваши данные по '10e8', и просто переименуйте ярлыки xtick в' r '$ 10^x $' '? – GWW

ответ

5

У меня есть два варианта, на которые вы можете обратить внимание.

Во-первых, установить местоположение оси и размер сами, как таковой:

# your imports and data above 
fig = plt.figure() 
ax0a = fig.add_axes([0.1, 0.1, 0.8, 0.25]) 
ax0b = fig.add_axes([0.1, 0.39, 0.8, 0.25], sharex=ax0a) 
ax0c = fig.add_axes([0.1, 0.68, 0.8, 0.25], sharex=ax0a) 
ax0a.set_xticklabels([]) 
ax0b.set_xticklabels([]) 
ax0a.plot(x,y) 
nbins = len(ax0a.get_xticklabels()) 
ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0b.plot(x,y) 
ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0c.plot(x,y) 
ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
plt.show() 

enter image description here

Второй вариант вручную настроить расположение и размер может быть шрифта смещения текста:

# your original code minus data and imports 
fig = plt.figure() 
gs1 = gridspec.GridSpec(3, 3) 
gs1.update(left=0.1, right=0.9, bottom=0.5, hspace=0.0) 
ax0a = plt.subplot(gs1[0, :]) 
ax0b = plt.subplot(gs1[1, :]) 
ax0c = plt.subplot(gs1[2, :]) 
ax0a.set_xticklabels([]) 
ax0b.set_xticklabels([]) 
ax0a.plot(x,y) 
nbins = len(ax0a.get_xticklabels()) 
ax0a.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0b.plot(x,y) 
ax0b.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 
ax0c.plot(x,y) 
ax0c.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper')) 

# play around with location and font of offset text here 
ax0a.get_yaxis().get_offset_text().set_x(-0.075) 
ax0a.get_yaxis().get_offset_text().set_size(10) 
ax0b.get_yaxis().get_offset_text().set_x(-0.075) 
ax0b.get_yaxis().get_offset_text().set_size(10) 
ax0c.get_yaxis().get_offset_text().set_x(-0.075) 
ax0c.get_yaxis().get_offset_text().set_size(10) 
plt.show() 

enter image description here

+1

Отлично! второй пример - именно то, что мне нужно. – Dave

0

Хорошо, это, вероятно, уродливое решение, но вы могли просто просто оценить ваши данные на нижних графиках с диапазоном мощности, то есть ax0b.plot(x, y*1e8). Это работает, по крайней мере, для вашего примера.

+0

Нет, я не могу сделать это так, мне нужно сохранить его в единицах, которые уже есть, но спасибо за предложение. – Dave

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