Python Matplotlib-根据log10值计算的箱线图,但以对数比例显示

Python Matplotlib-根据log10值计算的箱线图,但以对数比例显示,python,matplotlib,plot,boxplot,logarithm,Python,Matplotlib,Plot,Boxplot,Logarithm,我认为这是一个简单的问题,但我还是想不出一个简单的解决办法。我有一组分子丰度的数据,数值范围是许多数量级。我想用箱线图(箱线图和胡须图)来表示这些丰度,并且我想在对数刻度上计算箱线,因为数值范围很广。 我知道我可以计算数据的log10并将其发送到matplotlib的箱线图,但这不会在以后的图中保留对数刻度 所以我的问题基本上是这样的: 当我根据我的值的log10计算出一个箱线图时,我如何将之后的图转换为对数比例,而不是与log10值呈线性关系? 我可以改变勾号标签来部分修复这个问题,但我不知道

我认为这是一个简单的问题,但我还是想不出一个简单的解决办法。我有一组分子丰度的数据,数值范围是许多数量级。我想用
箱线图
箱线图和胡须图
)来表示这些丰度,并且我想在对数刻度上计算箱线,因为数值范围很广。 我知道我可以计算数据的log10并将其发送到matplotlib的
箱线图
,但这不会在以后的图中保留对数刻度

所以我的问题基本上是这样的: 当我根据我的值的log10计算出一个箱线图时,我如何将之后的图转换为对数比例,而不是与log10值呈线性关系? 我可以改变勾号标签来部分修复这个问题,但我不知道如何将对数刻度恢复到绘图中

或者有没有其他更直接的方法来描绘这一点。可能已经包含此选项的其他包


非常感谢你的帮助

我建议不要对原始值进行箱线图,并将y轴设置为对数,因为箱线图函数的设计不是为了跨数量级工作,并且可能会得到太多的异常值(当然,这取决于您的数据)

相反,我的建议是绘制数据的对数并手动调整y标签

下面是一个非常粗糙的例子:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

np.random.seed(42)

values = 10 ** np.random.uniform(-3, 3, size=100)

fig = plt.figure(figsize=(9, 3))


ax = plt.subplot(1, 3, 1)

ax.boxplot(np.log10(values))
ax.set_yticks(np.arange(-3, 4))
ax.set_yticklabels(10.0**np.arange(-3, 4))
ax.set_title('log')

ax = plt.subplot(1, 3, 2)

ax.boxplot(values)
ax.set_yscale('log')
ax.set_title('raw')

ax = plt.subplot(1, 3, 3)

ax.boxplot(values, whis=[5, 95])
ax.set_yscale('log')
ax.set_title('5%')

plt.show()

右图显示了原始值的方框图。这会导致许多异常值,因为最大晶须长度计算为四分位范围(框高度)的倍数(默认值:1.5),它不会在数量级之间缩放

或者,可以指定为给定的百分位范围绘制胡须:
ax.boxplot(值,whis=[5,95])

在这种情况下,您将获得固定数量的大纲视图(5%)。

您可以使用plt.yscale:

plt.boxplot(data); plt.yscale('log')

为什么不将log10计算值转换回正常值(
10**y
),并将y刻度设置为对数?也许我应该澄清一下,我创建的图是这样的:
bp=ax.boxplot(np.log10(abunds))
。此命令计算框值并创建绘图。我需要改变绘图中的东西,而不是值,对吗?你这样做,你在绘制不同的东西。我仍然不明白为什么你不能做
bp=ax.boxplot(abunds);ax.set_yscale('log')
。这将为您提供一个对数刻度,因此y记号正确地对应于您的值。因为日志值为负值(值为10^(-4)或更低),所以我得到了一个ax错误。set_yscale('log')Tobias您的日志值为负值,但您的原始
abunds
值不应为负值。你确定你完全按照@Evert的建议做了吗?谢谢你的好例子。有没有一种方法可以添加日志图的小刻度,因为它们在原始图中?我不知道,对不起。也许可以使用
matplotlib.ticker
:我可以按照主刻度的类似逻辑设置小刻度。例如,要在位置
1,2,…,9,20,30,…,90
处设置次刻度,请计算它们的log10并设置为次刻度:
minor\u xticks=np.log10(np.concatenate((np.arange(1,10),np.arange(1,10)*10)).astype(np float))
ax set\u xticks(minor\u xticks,minor=True)