Matplotlib - Boxplot根据log10值计算,但以对数标度显示

时间:2016-01-05 09:51:03

标签: python matplotlib plot boxplot logarithm

我认为这是一个简单的问题,但我似乎仍然无法想到一个简单的解决方案。我有一组分子丰度的数据,其数值范围很多。我想用boxplotsbox-and-whiskers plots)来表示这些丰度,并且我希望在对数刻度上计算方框,因为值范围很广。 我知道我只能计算数据的log10并将其发送到matplotlib的boxplot,但这不会在以后的图中保留对数标度。

所以我的问题基本上是这样的: 当我根据我的值的log10计算了一个箱线图时,如何将该图转换为以对数刻度显示而不是与log10值成线性? 我可以改变刻度标签来部分解决这个问题,但我不知道如何将对数刻度恢复到情节。

还是有另一种更直接的方式来绘制这个。可能已包含此选项的另一个包?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

我建议不要在原始值上绘制箱线图并将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%)。

答案 1 :(得分:1)

您可以使用 plt.yscale:

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