【问题标题】:Set width of plot and infer height from aspect ratio of subplots设置图的宽度并从子图的纵横比推断高度
【发布时间】:2018-08-14 08:07:20
【问题描述】:

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

示例:文章栏的宽度为 8.5 厘米。我想创建一个带有两个子图(轴)的图,并且为两个轴选择选项ax.set_aspect("equal"),以便y 轴上的 1 个单位与x 轴上的一个单位占用相同的物理空间。 我的绘图现在应该有 8.5 厘米的总宽度,但高度应该从 matplotlib 计算,并考虑子绘图的纵横比以及 xlimylim 值。

我怎样才能做到这一点?

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

params = {'text.usetex': True,
          'font.size': 11,
          'font.family': 'times',
          'text.latex.unicode': True,
          }
plt.rcParams.update(params)

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

【问题讨论】:

  • 图有相同的 x 和 y 限制吗?否则需要另一个约束。
  • 如果ax1ax2 没有相同的限制,它们的方面应该仍然是“相等的”,但现在两个子图之间1 个单位的物理尺寸会有所不同。但是ax1ax2 应该占据相同的宽度(或者理想情况下:可以提供以厘米为单位的固定尺寸或两者之间的比例)。

标签: python matplotlib


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2016-10-31
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多