簡體   English   中英

Matplotlib - 箱線圖根據 log10 值計算但以對數刻度顯示

[英]Matplotlib - Boxplot calculated on log10 values but shown in logarithmic scale

我認為這是一個簡單的問題,但我似乎仍然想不出一個簡單的解決方案。 我有一組分子豐度數據,其值范圍為多個數量級。 我想用箱線boxplotsbox-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()

結果

右圖顯示了原始值的箱線圖。 這會導致許多異常值,因為最大晶須長度被計算為四分位數間距(框高度)的倍數(默認值:1.5),它不會跨越多個數量級。

或者,您可以指定為給定的百分位數范圍繪制胡須: ax.boxplot(values, whis=[5, 95])在這種情況下,您會在上方和下方獲得固定數量的離群值 (5%)。

你可以使用 plt.yscale:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM