Matplotlib-根据log10值计算的方框图,但以对数s表示

2024-04-29 03:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以我的问题是: 当我根据我的值的log10计算了一个方框图时,我如何将之后的图转换成对数刻度而不是与log10值成线性? 我可以更改记号标签来部分修复这个问题,但我不知道如何将对数刻度恢复到绘图中。

或者还有其他更直接的方法来策划这件事。另一个包可能已经包含了这个选项?

非常感谢你的帮助。


Tags: and数据box绘图matplotlib对数分子plots
1条回答
网友
1楼 · 发布于 2024-04-29 03:26:26

我建议不要在原始值上绘制盒形图,也不要将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)计算的,而四分位数范围(框高)不会跨数量级缩放。

或者,可以指定绘制给定百分比范围的胡须: ax.boxplot(values, whis=[5, 95]) 在这种情况下,你会得到固定数量的大纲(5%)以上和以下。

相关问题 更多 >