簡體   English   中英

Matplotlib 中的堆積條形圖

[英]Stacked Bar Chart in Matplotlib

我正在嘗試在 Matplotlib 中創建堆疊條形圖。 我使用 Pandas 創建了一個簡單的,但我現在對 Matplotlib 感興趣,但無法使其工作。

我的資料

    ShiftType   ShiftNumber cnt
0   Non-Standard    1.0 154478
1   Non-Standard    2.0 140421
2   Non-Standard    3.0 159990
3   Standard    1.0 211100
4   Standard    2.0 198652
5   Standard    3.0 190857

使用 Pandas 工作的代碼。

df.groupby(by=['ShiftType','ShiftNumber']).size().rename('cnt').unstack().plot(kind='bar', stacked=True)
plt.legend(title='Shift Numbers', bbox_to_anchor=(1.0, 1), loc='upper left')

在 Python 中使用 Pandas 的堆積條形圖

我怎樣才能基於 Matplotlib 得到這個?

您提供的示例代碼沒有准確計算總和。 “在 Matplotlib 中創建堆疊條形圖”的含義也有些不清楚,因為您調用的 Pandas plot() 函數是 matplotlib 集成。 無論如何,作為標准(也可能是最佳)實踐,我經常使用圖形和軸來設置我的繪圖。 這允許仔細控制我認為你在這里嘗試做的情節。

我建議將此代碼作為您問題的解決方案和進一步繪圖操作的起點。

fig, ax = plt.subplots()

df.groupby(['ShiftType', 'ShiftNumber']) \
    ['cnt'].sum() \
    .reset_index() \
    .pivot_table(index='ShiftType', columns='ShiftNumber', values='cnt') \
    .plot(kind='bar', stacked=True, ax=ax)
ax.legend(title='Shift Numbers', bbox_to_anchor=(1.0, 1), loc='upper left')

然后我會添加一些每個圖表都應該有的標准功能,例如一個 y 標簽和一個標題。

ax.set_ylabel('cnt')
ax.set_title('Count of Shift Types')

結合這些,你將得到這個最終的情節。

ShiftType 堆積條形圖

可能有一些更緊湊的,但這里有一個解決方案。 這是你的 df

     ShiftType  ShiftNumber     cnt
0  Non-Standard          1.0  154478
1  Non-Standard          2.0  140421
2  Non-Standard          3.0  159990
3      Standard          1.0  211100
4      Standard          2.0  198652
5      Standard          3.0  190857
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
fig, ax = plt.subplots(figsize=(10,7))  

m = df['ShiftNumber'].drop_duplicates()
margin_bottom = np.zeros(len(df['ShiftType'].drop_duplicates()))
colors = ["#006D2C", "#31A354","#74C476"]

for num, m in enumerate(m):
    values = list(df[df['ShiftNumber'] == m].loc[:, 'cnt'])

    df[df['ShiftNumber'] == m].plot.bar(x='ShiftType',y='cnt', ax=ax, stacked=True, 
                                    bottom = margin_bottom, color=colors[num], label=m)
    margin_bottom += values

plt.show()

在此處輸入圖片說明

暫無
暫無

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

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