簡體   English   中英

為相鄰子圖設置相同的 x 比例但不同的 x 限制 matplotlib

[英]Setting the same x-scale but different x-limits for adjacent subplots matplotlib

我正在嘗試創建一個並排有三個條形圖的圖形。 這些條形圖具有不同的 yscale,但數據基本相似,因此我希望所有條形圖具有相同的寬度。 我能夠使條形具有完全相同寬度的唯一方法是在創建子圖時使用 sharex,以保持相同的 x 比例。

import matplotlib.pyplot as plt

BigData = [[100,300],[400,200]]
MediumData = [[40, 30],[50,20],[60,50],[30,30]]
SmallData = [[3,2],[11,3],[7,5]]
data = [BigData, MediumData, SmallData]
colors = ['#FC766A','#5B84B1']

fig, axs = plt.subplots(1, 3, figsize=(30,5), sharex=True)
subplot = 0
for scale in data:
    for type in range(2):
        bar_x = [x + type*0.2 for x in range(len(scale))]
        bar_y = [d[type] for d in scale]
        axs[subplot].bar(bar_x,bar_y, width = 0.2, color = colors[type])
        
    subplot += 1
plt.show()

這將創建此圖:

數字

這樣做的問題是 plot 的 x 限制也是共享的,導致不需要的空白。 事后我嘗試設置 x-bounds,但它似乎沒有覆蓋 sharex。 有沒有辦法使條形圖具有相同的寬度,而每個子圖的寬度也不相同?

此外,有沒有一種方法可以創建這樣的 plot(根據數據大小具有不同的 y 比例),而無需事先手動對數據進行排序,如我的代碼中所示?

謝謝!

感謝 Jody Klymak 幫助找到此解決方案。 我想我應該為未來的用戶記錄下來。

我們可以使用 'width_ratios' GridSpec 參數。 不幸的是,在我們已經繪制了一個圖表之后沒有辦法指定這些比率,所以我發現實現這一點的最佳方法是編寫一個 function 來創建一個虛擬圖表,並測量該圖表的 x 限制:

def getXRatios(data, size):
    phig, aks = plt.subplots(1, 3, figsize=size)
    subplot = 0
    for scale in data:
        for type in range(2):
            bar_x = [x + type*0.2 for x in range(len(scale))]
            bar_y = [d[type] for d in scale]
            aks[subplot].bar(bar_x,bar_y, width = 0.2)
        subplot += 1
    ratios = [aks[i].get_xlim()[1] for i in range(3)]
    plt.close(phig)
    return ratios

這本質上與創建實際圖形的代碼相同,去掉了裝飾方面,因為我們想要從這個虛擬圖形中得到圖形的 x 限制(我們無法從實際圖形中得到我們需要的東西)在我們開始之前定義這些限制以解決問題)。

現在您需要做的就是在創建子圖時調用此 function:

fig, axs = plt.subplots(1, 3, figsize=(40,5), gridspec_kw = {'width_ratios':getXRatios(data,(40,5))})

只要您的 XRatio function 以與實際圖表相同的方式創建圖表,一切都應該正常工作! 這是我的output使用此解決方案。

為了節省空間,您可以重新使用 getXRatios function 來構建最終圖形,方法是在 arguments 中調用自身並提供返回比率或最終數字的選項。 我不能打擾。

暫無
暫無

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

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