2015-10-05 3 views
2

Я использую библиотеку yt-Project для визуализации данных и создания графиков. Теперь я хочу создать сюжет, содержащий два подзаголовка. По-видимому, это невозможно напрямую с yt, и вы должны использовать matplotlib для дальнейшей настройки (описано here). Будучи не используется для Matplotlib (и питона вообще) я пытался что-то вроде этого:Добавление подзаголовков в проект yt-Project

slc = yt.SlicePlot(ds, 'x', 'density') 
dens_plot = slc.plots['density'] 

fig = dens_plot.figure 
ax = dens_plot.axes 
#colorbar_axes = dens_plot.cax 

new_ax2 = fig.add_subplot(212) 

slc.save() 

Но вместо того, чтобы добавить еще один сюжетные под первой, она добавляет его в нем. enter image description here

То, что я хотел бы достичь, было бы еще одним графиком из другого набора данных с той же цветной полосой и теми же осями x и y, которые были правы ниже первого.

Благодарим за помощь.

+0

Спасибо за использование yt! Если вы столкнетесь с дополнительными проблемами, вы получите больше внимания от разработчика, если вы отправите сообщение в наш список рассылки. Тем не менее, я обязательно буду следить за StackOverflow за ваши вопросы в будущем. – ngoldbaum

ответ

3

В настоящее время самым простым способом является использование AxesGrid, как in this yt cookbook example, так и this one.

Вот пример, который описывает плотность газа в два раза по временному ряду, используя yt 3.2.1. Пример данных, которые я использую, можно загрузить с http://yt-project.org/data.

import yt 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import AxesGrid 

fns = ['enzo_tiny_cosmology/DD0005/DD0005', 'enzo_tiny_cosmology/DD0040/DD0040'] 

fig = plt.figure() 

# See http://matplotlib.org/mpl_toolkits/axes_grid/api/axes_grid_api.html 
# These choices of keyword arguments produce a four panel plot with a single 
# shared narrow colorbar on the right hand side of the multipanel plot. Axes 
# labels are drawn for all plots since we're slicing along different directions 
# for each plot. 
grid = AxesGrid(fig, (0.075,0.075,0.85,0.85), 
       nrows_ncols = (2, 1), 
       axes_pad = 0.05, 
       label_mode = "L", 
       share_all = True, 
       cbar_location="right", 
       cbar_mode="single", 
       cbar_size="3%", 
       cbar_pad="0%") 

for i, fn in enumerate(fns): 
    # Load the data and create a single plot 
    ds = yt.load(fn) # load data 

    # Make a ProjectionPlot with a width of 34 comoving megaparsecs 
    p = yt.ProjectionPlot(ds, 'z', 'density', width=(34, 'Mpccm')) 

    # Ensure the colorbar limits match for all plots 
    p.set_zlim('density', 1e-4, 1e-2) 

    # This forces the ProjectionPlot to redraw itself on the AxesGrid axes. 
    plot = p.plots['density'] 
    plot.figure = fig 
    plot.axes = grid[i].axes 
    plot.cax = grid.cbar_axes[i] 

    # Finally, this actually redraws the plot. 
    p._setup_plots() 

plt.savefig('multiplot_1x2_time_series.png', bbox_inches='tight') 

yt multiplot

Вы можете сделать это по-своему тоже (с помощью fig.add_subplots вместо AxesGrid), но вам нужно вручную позиционировать оси, а также изменить размер фигуры.

Наконец, если вы хотите, чтобы фигура была меньше, вы можете контролировать размер фигуры, пройдя фигуру размером в дюймах, когда вы создадите фигуру с помощью plt.figure(). Если вы это сделаете, вы можете также отрегулировать размер шрифта, вызвав p.set_font_size() на ProjectionPlot.

+0

все в порядке, но сейчас я столкнулся с другой проблемой. Я использую yt, чтобы визуализировать симуляцию эйлеровой сетки с адаптивной сеткой. То, что я хотел показать на этих участках, - это структура сетки в определенное время. Я распознал yt в основном для своей функции .annotate_grid(), которая работала довольно убедительно в коде, таком как 'yt.SlicePlot (ds, 'x'," плотность "). Annotate_grids(). Save()'. Однако в вашем решении 'p = yt.ProjectionPlot (ds, 'z', 'density'). Annotate_grids()' не оказывает никакого влияния на график. Есть идеи? –

+0

Я постараюсь посмотреть на это сегодня. – ngoldbaum

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