我正在使用yt-Project库来可视化数据并创建图。
现在,我想创建一个包含两个子图的图。看来yt不可能直接做到这一点,您必须使用matplotlib进行进一步的自定义(描述为here)。
由于不习惯使用matplotlib(和一般的python),我尝试了如下操作:

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()


但是,没有在第一个子图下添加另一个子图,而是在其中添加了子图。
python - 在yt-Project图中添加子图-LMLPHP

我要实现的是从另一个数据集中获得的另一幅图,该数据集具有相同的颜色条,并且在第一个图的正下方具有相同的x和y轴。

谢谢您的帮助。

最佳答案

现在,最简单的方法是使用in this yt cookbook examplethis one的AxesGrid。

这是一个使用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')


python - 在yt-Project图中添加子图-LMLPHP

您也可以按照自己的方式进行操作(使用fig.add_subplots代替AxesGrid),但是您需要手动定位轴并调整图形的大小。

最后,如果希望缩小图形,则在通过plt.figure()创建图形时,可以通过传递图形尺寸(以英寸为单位)来控制图形的尺寸。如果这样做,您可能还希望通过在p.set_font_size()上调用ProjectionPlot来调整字体大小。

关于python - 在yt-Project图中添加子图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32954812/

10-12 17:02