gpt4 book ai didi

python - Matplotlib - 箱线图根据 log10 值计算但以对数刻度显示

转载 作者:太空狗 更新时间:2023-10-30 00:02:11 25 4
gpt4 key购买 nike

我认为这是一个简单的问题,但我似乎还是想不出一个简单的解决方案。我有一组分子丰度数据,其值范围为多个数量级。我想用 boxplots(box-and-whiskers plots)表示这些丰度,并且由于值的范围很广,我希望在对数尺度上计算这些框。我知道我可以只计算数据的 log10 并将其发送到 matplotlib 的 boxplot,但这不会在以后的绘图中保留对数刻度。

所以我的问题基本上是这样的:当我根据我的值的 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()

results

右图显示了原始值的箱线图。这会导致许多异常值,因为最大晶须长度计算为四分位数间距(框高度)的倍数(默认值:1.5),它不会跨越多个数量级。

或者,您可以指定为给定的百分位数范围绘制 mustache :ax.boxplot(values, whis=[5, 95])在这种情况下,您会得到上下固定数量的异常值 (5%)。

关于python - Matplotlib - 箱线图根据 log10 值计算但以对数刻度显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com