在 yt-Project 图中添加子图
Adding subplots within yt-Project plot
我正在使用 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()
但是它没有在第一个子图下面添加另一个子图,而是在其中添加了它。
我想要实现的是来自不同数据集的另一幅图,具有相同的颜色条和相同的 x 轴和 y 轴,就在第一个图的正下方。
感谢您的帮助。
目前最简单的方法是使用 AxesGrid,如 in this yt cookbook example as well as 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')
您也可以按照自己的方式进行(使用 fig.add_subplots
而不是 AxesGrid
),但是您需要手动定位坐标轴并调整图形大小。
最后,如果你想让图形变小,你可以在通过plt.figure()
创建图形时通过传递一个以英寸为单位的图形大小来控制图形的大小。如果这样做,您可能还想通过在 ProjectionPlot
.
上调用 p.set_font_size()
来调整字体大小
我正在使用 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()
但是它没有在第一个子图下面添加另一个子图,而是在其中添加了它。
我想要实现的是来自不同数据集的另一幅图,具有相同的颜色条和相同的 x 轴和 y 轴,就在第一个图的正下方。
感谢您的帮助。
目前最简单的方法是使用 AxesGrid,如 in this yt cookbook example as well as 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')
您也可以按照自己的方式进行(使用 fig.add_subplots
而不是 AxesGrid
),但是您需要手动定位坐标轴并调整图形大小。
最后,如果你想让图形变小,你可以在通过plt.figure()
创建图形时通过传递一个以英寸为单位的图形大小来控制图形的大小。如果这样做,您可能还想通过在 ProjectionPlot
.
p.set_font_size()
来调整字体大小