当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Matplotlib-Boxplot根据log10值计算但以对数刻度显示》经验,为你挑选了1个好方法。

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

所以我的问题基本上是这样的:当我根据数值的log10计算出箱形图后,如何将其转换成对数刻度而不是与log10值呈线性关系?我可以更改刻度标签以部分解决此问题,但是我不知道如何将对数刻度返回到绘图。

还是有另一种更直接的方法来绘制此图。可能已经包含此选项的其他软件包?

非常感谢您的帮助。



1> kazemakase..:

我建议不要对原始值进行箱形图绘制,而将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%)。

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有