簡體   English   中英

Matplotlib水平條形圖,沿y軸帶有x軸標簽

[英]Matplotlib horizontal bar graph with x-axis label along y-axis

我一直按照以下代碼片段使用Pyasciigraph模塊

thresholds = {
        int(mean): Gre, int(mean * 2): Yel, int(mean * 3): Red,
    }
    data = hcolor(chart, thresholds)

graph = Pyasciigraph(
            separator_length=4,
            multivalue=False,
            human_readable='si',
        )

for line in graph.graph(title, data):
    print(line)
    print("")

繪制水平條形圖,如下所示(y軸標簽在下面的屏幕快照中不可見):

使用Pyasciigraph的條形圖

現在,我試圖使用matplotlib對相同的數據進行繪制,而我的示例代碼是:

import collections
import matplotlib.pyplot as plt

D = [(u'00:00', 1), (u'01:00', 1), (u'02:00', 0), (u'03:00', 0), (u'04:00', 0), (u'05:00', 0), (u'06:00', 1), (u'07:00', 7), (u'08:00', 3), (u'09:00', 2), (u'10:00', 6), (u'11:00', 2), (u'12:00', 4), (u'13:00', 4), (u'14:00', 1), (u'15:00', 6), (u'16:00', 3), (u'17:00', 2), (u'18:00', 1), (u'19:00', 1), (u'20:00', 0), (u'21:00', 2), (u'22:00', 2), (u'23:00', 1)]
D2 = dict(D)
od2 = collections.OrderedDict(sorted(D2.items(), reverse=True))

plt.barh(range(len(od2)), od2.values(), align='center')
plt.yticks(range(len(od2)), od2.keys())
plt.gca().axes.get_xaxis().set_ticks([])
plt.show()

如下圖所示: 在此處輸入圖片說明

與使用Pyasciigraph繪制的圖相比,此圖中我缺少的是:

  1. x軸值(標簽)在y軸的右側。
  2. 如Pyasciigraph中所示,我可以定義閾值,即特定x值范圍的顏色變化。

與我的相關的stackoverflow的最接近答案是this ,但沒有幫助。

任何建議,技巧,幫助將不勝感激。

為了在圖的右側顯示條形 ,您可以使用雙軸並將其標簽設置為字典中的值。

為了產生閾值條形圖,可以將多個條形圖相互疊加繪制,每次將值截斷到閾值時。

import collections
import matplotlib.pyplot as plt

D = [(u'00:00', 1), (u'01:00', 1), (u'02:00', 0), (u'03:00', 0), (u'04:00', 0), 
     (u'05:00', 0), (u'06:00', 1), (u'07:00', 7), (u'08:00', 3), (u'09:00', 2), 
     (u'10:00', 6), (u'11:00', 2), (u'12:00', 4), (u'13:00', 4), (u'14:00', 1), 
     (u'15:00', 6), (u'16:00', 3), (u'17:00', 2), (u'18:00', 1), (u'19:00', 1), 
     (u'20:00', 0), (u'21:00', 2), (u'22:00', 2), (u'23:00', 1)]
D2 = dict(D)
od = collections.OrderedDict(sorted(D2.items(), reverse=True))

fig, ax = plt.subplots()
ax.barh(range(len(od)), od.values(), align='center')

thr = lambda l, t:  [v if (v <= t) else t for v in l ]

ax.barh(range(len(od)), thr(od.values(),4), align='center')
ax.barh(range(len(od)), thr(od.values(),2), align='center')

ax.set_yticks(range(len(od)))
ax.set_yticklabels(od.keys())
ax.set_xticks([])

ax2 = ax.twinx()
ax2.set_ylim(ax.get_ylim())
ax2.set_yticks(range(len(od)))
ax2.set_yticklabels(od.values())

plt.show()

在此處輸入圖片說明

暫無
暫無

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

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