在对数坐标轴上绘制负值

34

我正在分析计算一个负数log_10(x)的值。现在我想要绘制这些值,但由于答案的范围非常大,所以我想要使用对数刻度来表示。如果我只是使用plt.yscale('log'),那么会出现以下消息:UserWarning: Data has no positive values, and therefore cannot be log-scaled. 我也不能把x的值提供给plt.plot,因为log_10(x)的结果非常大且为负,导致x**(log_10(x))的结果仅为0

有什么最简单的方法可以绘制这些数据吗?

2个回答

76

你可以使用

plt.yscale('symlog')

将比例尺设置为对称的对数比例尺。这意味着它将以对数方式缩放到0的两侧。只使用symlog比例尺的负部分也可以完美地工作。


1
这是一个函数,用于将范围分割成符号对数刻度的箱子:https://gist.github.com/artoby/0bcf790cfebed5805fbbb6a9853fe5d5。 - artoby

1

ImportanceOfBeingErnest的解决方案有两个替代方案:

  1. 在半对数y轴上绘制-log_10(x),并将y轴标签设置为负单位
  2. 在线性比例尺上绘制-log_10(-log_10(x))

但是,在所有情况下(包括ImportanceOfBeingErnest提出的解决方案),解释都不直观,因为您正在显示或计算对数的对数。

最后,为了返回x的值,您需要计算10**(log_10(x))而不是x**(log_10(x))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接