我认为这是一个简单的问题,但我似乎仍然无法想到一个简单的解决方案。我有一组分子丰度的数据,其数值范围很多。我想用boxplots
(box-and-whiskers plots
)来表示这些丰度,并且我希望在对数刻度上计算方框,因为值范围很广。
我知道我只能计算数据的log10并将其发送到matplotlib的boxplot
,但这不会在以后的图中保留对数标度。
所以我的问题基本上是这样的: 当我根据我的值的log10计算了一个箱线图时,如何将该图转换为以对数刻度显示而不是与log10值成线性? 我可以改变刻度标签来部分解决这个问题,但我不知道如何将对数刻度恢复到情节。
还是有另一种更直接的方式来绘制这个。可能已包含此选项的另一个包?
非常感谢你的帮助。
答案 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()
右图显示原始值的方框图。这导致许多异常值,因为最大晶须长度被计算为四分位数范围(盒子高度)的倍数(默认值:1.5),其不会在数量级上扩展。
或者,您可以指定绘制给定百分位数范围的胡须:
ax.boxplot(values, whis=[5, 95])
在这种情况下,你会得到固定数量的上下(5%)。
答案 1 :(得分:1)
您可以使用 plt.yscale:
plt.boxplot(data); plt.yscale('log')