我正在尝试制作一系列matplotlib图,用于绘制不同类别对象的时间跨度。每个绘图都有一个相同的x轴和绘图元素,如标题和图例。但是,每个图中出现的类别不同;每个图表代表一个不同的抽样单位,每个抽样单位只包含所有可能类别的子集。
我在确定如何设置图形和轴尺寸方面遇到了很多麻烦。水平尺寸应始终保持不变,但垂直尺寸需要缩放到该采样单元中表示的类数。对于每个图,y轴上每个条目之间的距离应相等。
似乎我的困难在于我可以用plt.figure(figsize=(w,h))
设置图的绝对大小(以英寸为单位),但我只能用相对尺寸设置轴的大小(例如{ {1}}当类的数量很少时,这导致我的x轴标签被切断。
这是我使用的代码的简化版本。希望它足以识别问题/解决方案。
fig.add_axes([0.3,0.05,0.6,0.85])
答案 0 :(得分:3)
You can start by defining the margins on top and bottom in units of inches. Having a fixed unit of one data unit in inches allows to calculate how large the final figure should be.
Then dividing the margin in inches by the figure height gives the relative margin in units of figure size, this can be supplied to the figure using subplots_adjust
, given the subplots has been added with add_subplot
.
A minimal example:
import numpy as np
import matplotlib.pyplot as plt
data = [np.random.rand(i,2) for i in [2,5,8,4,3]]
height_unit = 0.25 #inch
t = 0.15; b = 0.4 #inch
for d in data:
height = height_unit*(len(d)+1)+t+b
fig = plt.figure(figsize=(5, height))
ax = fig.add_subplot(111)
ax.set_ylim(-1, len(d))
fig.subplots_adjust(bottom=b/height, top=1-t/height, left=0.2, right=0.9)
ax.barh(range(len(d)),d[:,1], left=d[:,0], ec="k")
ax.set_yticks(range(len(d)))
plt.show()