2015-11-19 2 views
2

создать 3 питона участки с colorbar() из различных данных в отдельных папках, используя следующий код:Создание Heatmap без Colorbar в Matplotlib

import numpy as np 
from matplotlib import pyplot as pp 
pp.rcParams.update({'figure.autolayout': True}) 

data=np.loadtxt("performance.dat") 
A=np.reshape(data, (21,21,4)) 
x=A[:,:,0] 
y=A[:,:,1] 
rn=A[:,:,3] 

f=pp.figure() 
ax=f.add_subplot(111,) 
fs=20 
for tick in ax.axes.xaxis.get_major_ticks(): 
      tick.label.set_fontsize(fs) 
for tick in ax.yaxis.get_major_ticks(): 
      tick.label.set_fontsize(fs) 

pp.pcolor(np.log10(x),np.log10(y),rn) 
pp.clim(0,2) 
pp.xlabel(r"$\log \, \sigma_1$", size=28) 
pp.ylabel(r"$\log \, \sigma_2$",size=28) 
pp.colorbar().ax.tick_params(labelsize=20) 
pp.show() 

Тогда я вставить его в мою сторону LaTeX файла бок с:

\begin{figure}[H] 

\makebox[\linewidth][c]{ 
\begin{subfigure}[b]{.4\textwidth} 
    \centering 
    \includegraphics[width=.95\textwidth, bb = -0 -0 530 420]{m200_l10_p90}%-0 -0 588 444 
\end{subfigure} 
% 
\begin{subfigure}[b]{.4\textwidth} 
    \centering 
    \includegraphics[width=.95\textwidth, bb = -0 -0 530 420]{m200_l10_p95}% 
\end{subfigure} 
% 
\begin{subfigure}[b]{.4\textwidth} 
    \centering 
    \includegraphics[width=.95\textwidth, bb = -0 -0 530 420]{m200_l10_P99} 
\end{subfigure} 
} 
\caption{bla} 
\label{fig:bla} 
\end{figure} 

я получаю:

LaTeX output

Очевидно, что это не выглядит хорошо, я играл в LaTeX, и до сих пор это было лучшее, что я мог получить, чтобы сделать его доступным для чтения. Возможно, моя идея состояла в том, чтобы создать только один график, показывающий вертикальную полосу цвета (последний график), первый сюжет с только «ярлыком» и «средний» с меткой «x», который будет выглядеть лучше, я думаю.

Мой вопрос в том, как создать цветной график без отображения панели? Я попытался прокомментировать строку pp.colorbar().ax.tick_params(labelsize=20), но это испортило сюжет.

Участки по-прежнему нуждаются в большей этикетке и тике.

+0

Альтернативой вы могли бы рассмотреть PGFplots, которые будут создавать графики непосредственно в LaTeX. Он содержит встроенные средства для опускания меток оси, когда у вас есть несколько графиков, которые разделяют ось. Но это выходит за рамки этого вопроса. –

+0

Спасибо @DavidZ, никогда не слышал об этом. Но я бы предпочел прямое решение Python! Спасибо за редактирование тоже – lailaw

+1

Кроме того, я попытался создать сюжет такого типа без вызова colorbar, и он отлично работает. Не могли бы вы уточнить, что не так, когда вы пытаетесь удалить эту строку? –

ответ

3

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

np.genfromtxt('/path/to/performance.dat') 

Вы можете созданы все 3 тепловые карты в одном рисунке, используя делянок.

Затем просто добавьте новые оси вправо и постройте colorbar на этом axes там (используя cax kwarg).

Наконец, его легко добавить только ylabel в левую руку (только положите его на ax1).

Я использовал subplots_adjust, чтобы установить поля в разумных местах и ​​сделать комнату справа для цветной панели. Вы заметите, что нижняя и верхняя часть команды subplots_adjust используются повторно, чтобы сделать ось colorbar, так что все это хорошо сочетается.

import matplotlib.pyplot as plt 
import numpy as np 

# Sample data. You can get yours with np.genfromtxt('/path/to/performance.dat') 
data1 = np.random.rand(20,20)*2 
data2 = np.random.rand(20,20)*2 
data3 = np.random.rand(20,20)*2 

fig = plt.figure(figsize=(9,3)) 

bottom,top,left,right = 0.2,0.9,0.1,0.85 
fig.subplots_adjust(bottom=bottom,left=left,right=right,top=top) 

# fancy new colormap, just because... 
plt.viridis() 

# Add the 3 subplots 
ax1 = fig.add_subplot(131) 
ax2 = fig.add_subplot(132) 
ax3 = fig.add_subplot(133) 

# Plot the data 
for ax,data in zip(fig.axes,[data1,data2,data3]): 
    p=ax.pcolor(data,vmin=0,vmax=2) 
    # xlabel on all subplots 
    ax.set_xlabel(r"$\log \, \sigma_1$", size=28) 

# ylabel only on the left 
ax1.set_ylabel(r"$\log \, \sigma_2$", size=28) 

# add_axes takes (left,bottom,width,height) 
# height is just top-bottom 
cax = fig.add_axes([right+0.05,bottom,0.03,top-bottom]) 
fig.colorbar(p,cax=cax) 

plt.show() 

enter image description here

Альтернативный способ выровнять все подзаговоры является использование AxesGrid из mpl_toolkits.axes_grid1, который будет делать все автоматически. Вот сценарий сверху, измененный для AxesGrid.

import matplotlib.pyplot as plt 
import numpy as np 
from mpl_toolkits.axes_grid1 import AxesGrid 

# Sample data. You can get yours with np.genfromtxt('/path/to/performance.dat') 
data1 = np.random.rand(20,20)*2 
data2 = np.random.rand(20,20)*2 
data3 = np.random.rand(20,20)*2 

fig = plt.figure(figsize=(9,3)) 

fig.subplots_adjust(bottom=0.2) 
plt.viridis() 

grid = AxesGrid(fig, 111, 
       nrows_ncols=(1, 3), 
       axes_pad=0.2, 
       share_all=True, 
       label_mode="L", 
       cbar_location="right", 
       cbar_mode="single", 
       ) 

for ax,data in zip(grid,[data1,data2,data3]): 
    p=ax.pcolor(data,vmin=0,vmax=2) 
    ax.set_xlabel(r"$\log \, \sigma_1$", size=28) 

grid[0].set_ylabel(r"$\log \, \sigma_2$", size=28) 

grid.cbar_axes[0].colorbar(p) 

plt.show() 

enter image description here

+0

Спасибо! Получение их с разных путей - хорошая идея, я не знал этого! – lailaw

+0

Да, это было бы и мое предложение (я просто не смог написать это в ответ). –

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