根据子图的长宽比设置图宽和推断高度

时间:2018-08-14 08:07:21

标签: python matplotlib

我经常必须创建具有固定宽度(例如,文章的列宽)并且其子图在数据坐标系中具有固定比率的图。我想手动设置宽度,并获得具有所选宽度,子图的长宽比和适当高度的图形。

示例:文章的各列宽度为8.5厘米。我想创建一个具有两个子图(轴)的图,并且对于两个轴都选择了选项ax.set_aspect("equal"),以使y轴上的1个单位与{{1 }}轴。 我的图现在应该具有8.5cm的总宽度,但是应该通过考虑子图的长宽比以及xxlim值从matplotlib计算高度。

我该如何实现?

此外,如何确保绘图中使用的字体大小与文章中使用的字体大小相同?因此,如果我的文章在11pt中设置为“ times”,如何在情节中获得相同大小的相同字体?我尝试使用

ylim

但是例如,我的绘图中的x和y字体现在比文章中大得多。我以为'font.size'会更新所有字体大小?

1 个答案:

答案 0 :(得分:1)

您可以根据宽度和子图参数来计算图形的高度。以下假设子图的宽度相等,并且只有一排子图并且它们都具有定义的外观(即不是“自动”)。

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1,ax2) = plt.subplots(1,2, figsize=(8.5,8.5))
for ax in (ax1, ax2):
    ax.set_aspect("equal")

ax1.plot([1,3], [4,6], marker="o")
ax2.plot([26,84], [64,-13], marker="s")

def resize(axes):
    # this assumes a fixed aspect being set for the axes.
    for ax in axes:
        if ax.get_aspect() == "auto":
            return
        elif ax.get_aspect() == "equal":
            ax.set_aspect(1)
    fig = axes[0].figure
    s = fig.subplotpars
    n = len(axes)
    axw = fig.get_size_inches()[0]*(s.right-s.left)/(n+(n-1)*s.wspace)
    r = lambda ax: np.diff(ax.get_ylim())[0]/np.diff(ax.get_xlim())[0]*ax.get_aspect()
    a = max([r(ax) for ax in axes])
    figh = a*axw/(s.top-s.bottom)
    fig.set_size_inches(fig.get_size_inches()[0],figh)

resize((ax1,ax2))

plt.show()