我建議不要在原始值上做boxplot,並將y軸設置爲對數,因爲boxplot函數並非設計用於處理跨越數量級的數據,而且您可能會得到太多離羣值(取決於您的數據, 當然)。
相反,我的建議是繪製數據的對數並手動調整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])
在這種情況下你得到outlires固定量的(5%)的上方和下方。
爲什麼不將log10的計算值轉換回正常值('10 ** y')並將y值設爲對數? – Evert
也許我應該澄清一下,我創建了這樣的情節:'bp \t = \t ax.boxplot(np.log10(abunds))''。該命令計算框值並創建繪圖。我需要改變情節中的東西,而不是價值觀,對吧? – Tobias
你這樣做的方式,你正在繪製不同的東西。我仍然不明白你爲什麼不能做'bp = ax.boxplot(abunds); ax.set_yscale( '登錄')'。這會給你一個對數刻度,因此y-ticks正確地對應你的值。 – Evert