最近、積み上げヒストグラムを描画する必要があります。matplotlib には値の表示に対するネイティブ サポートがないため、関数 plt.text(x, y, value) を使用して間接的に実装する必要があります。積み上げヒストグラムの実現は、実際には通常のヒストグラムと同じで、主に各列を走査して x、y 座標を計算すれば問題ありません。実は注意すべき点は 1 つだけ、それは縦棒の移動順序です。通常の縦棒グラフの構造は単純で、下から上に移動する (私の場合は水平です)。観察した結果、幅が第一です。つまり、柱が 4 本の副柱で構成されている場合、N 字型に横断することになります。つまり、同じ種類のすべての柱を横断することになります。柱の値が 0 の場合、柱だけが存在します ただし、列の長さも 0 なので、データが固定されれば、列の数は固定されます。値 0 を表示するかどうかを決定できます。これを知っていると、実際に処理するのは簡単です。くだらないことを言わずに、コードをアップロードするだけです。
生データ
ナンバープレート | 最初のレベルでの失敗の数 | 二次障害の数 | 第 3 レベルの故障時間 | 異常故障回数 | 失敗の総数 |
221101-001 | 2 | 0 | 0 | 3 | 5 |
221101-002 | 5 | 2 | 0 | 4 | 11 |
221101-003 | 3 | 3 | 15 | 9 | 30 |
221101-004 | 3 | 0 | 0 | 2 | 5 |
221102-005 | 0 | 3 | 0 | 31 | 34 |
221102-006 | 0 | 0 | 1 | 3 | 4 |
221103-007 | 2 | 3 | 0 | 4 | 9 |
221103-008 | 0 | 0 | 0 | 2 | 2 |
221103-009 | 2 | 0 | 0 | 0 | 2 |
221103-010 | 0 | 3 | 0 | 17 | 20 |
221104-011 | 2 | 1 | 0 | 10 | 13 |
221104-012 | 4 | 0 | 0 | 0 | 4 |
221105-013 | 0 | 0 | 0 | 4 | 4 |
221107-014 | 0 | 0 | 0 | 1 | 1 |
コード
stack_chart = self.error_times_1000.plot.barh(y=["一级故障次数","二级故障次数","三级故障次数","异常故障次数"],figsize=(14,8),title="千公里故障次数_堆叠图",stacked=True)
b_list = list(np.arange(1,len(stack_chart.patches)*2,2))
print("=================lenof pathes===============",len(stack_chart.patches))
width_list = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for idx,rect in enumerate(stack_chart.patches):
print("==============x================",idx,rect.get_x() + rect.get_width() + 0.1,b_list[idx] * rect.get_height()-0.6,int(rect.get_width()))
print("===============rect=============",rect.get_x(),rect.get_y(),rect.get_width(),rect.get_height())
if rect.get_width() != 0:
plt.text(width_list[idx%14] + rect.get_width()/2, (b_list[idx] * rect.get_height()-0.5)%(28*0.5) - 0.2, '%s' % int(rect.get_width()))
width_list[idx%14] += rect.get_width()
Pandas は積み上げヒストグラムを描画するために stacked=True パラメーターを追加するだけで済みます。y パラメーターは描画する列を指定できますが、これは非常に単純で失礼です。ここでさらに面倒なのが数値表示で、真ん中の数値を全て表示するには前の列の長さを記録する必要があり、2列目・3列目・4列目を描画する際には、以前の長さ。垂直座標は、列の幅が 0.5 で、空白スペースも 0.5 なので、列の数は 14 なので、2 を掛けて、28 に 0.5 を掛けます。ゼロ以外の値のみが表示されます。そうでない場合は、非常に奇妙に見えます。
効果
もちろん、数値表示の位置が正確でない場合は、自分でゆっくり調整できます。pandas で直接描画するのは比較的簡単です。matplotlib を使用して描画する場合は、コードの行数は少し増えるかもしれませんが、そのため、パンダに慣れている人は、より上手に描くためにパンダを使用することをお勧めします。