【问题标题】:Aspect ratio in semi-log plot with Matplotlib使用 Matplotlib 的半对数图中的纵横比
【发布时间】:2018-08-03 03:55:43
【问题描述】:

当我在 matplotlib 中绘制一个函数时,该图被一个矩形框住。我希望这个矩形的长度和高度的比率由黄金平均值给出,即 dx/dy=1.618033...

如果 x 和 y 比例是线性的,我使用 google 找到了这个解决方案

import numpy as np
import matplotlib.pyplot as pl
golden_mean = (np.sqrt(5)-1.0)/2.0
dy=pl.gca().get_ylim()[1]-pl.gca().get_ylim()[0]
dx=pl.gca().get_xlim()[1]-pl.gca().get_xlim()[0]
pl.gca().set_aspect((dx/dy)*golden_mean,adjustable='box')

如果是对数图,我想出了这个解决方案

dy=np.abs(np.log10(pl.gca().get_ylim()[1])-np.log10(pl.gca().get_ylim()[0]))
dx=np.abs(np.log10(pl.gca().get_xlim()[1])-np.log10(pl.gca().get_xlim()[0]))
pl.gca().set_aspect((dx/dy)*golden_mean,adjustable='box')

但是,对于半对数图,当我调用 set_aspect 时,我得到了

UserWarning: aspect is not supported for Axes with xscale=log, yscale=linear

谁能想到解决办法?

【问题讨论】:

  • 您可以使用gcf().set_size_inches(16.18,10) 来控制形状。如果您设置子图,它不会完全符合您的要求。我也不认为它会在单个轴上完全执行该比率。标题、轴标签等可能会扭曲轴(不确定)。
  • 如你所说,这不是我想要的:/

标签: python matplotlib aspect-ratio logarithm


【解决方案1】:

最简单的解决方案是记录您的数据,然后使用 lin-lin 的方法。

然后你可以给坐标轴加上标签,让它看起来像一个正常的对数图。

ticks = np.arange(min_logx, max_logx, 1)
ticklabels = [r"$10^{}$".format(tick) for tick in ticks]

pl.yticks(ticks, ticklabels)

如果您的值高于 10e9,则需要三对大括号,两对用于 LaTeX 大括号,一对用于 .format()

ticklabels = [r"$10^{{{}}}$".format(tick) for tick in ticks]

编辑: 如果你还想要 0.1ex ... 0.9ex 的刻度,你也想使用次要刻度: 它们需要位于 log10(1), log10(2), log10(3) ..., log10(10), log10(20) ...

您可以使用以下方法创建和设置它们:

minor_ticks = []
for i in range(min_exponent, max_exponent):
    for j in range(2,10):
         minor_ticks.append(i+np.log10(j))


plt.gca().set_yticks(minor_labels, minor=True)

【讨论】:

  • 好主意。但是在对数刻度上,我在大刻度之间有这些小刻度。我怎么得到这个?
  • 更具体地说:我得到的是 !this 但我想要的是 !that
  • 非常感谢!我不知道可以手动设置这些小刻度!您的解决方案就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多