簡體   English   中英

matplotlib:雙重圖表(圖表和事件)

[英]matplotlib: dual chart (plot and events)

我正在嘗試創建與所附圖像相似的圖表。 在此處輸入圖片說明

我計划使用matplotlib,但不確定使用哪種類型的圖表。

底部的圖表顯示了人們從公交車進出的情況。 頂部的圖表顯示了在特定時間的門開和關。

該圖表是根據具有門事件時間戳記和事件計數時間戳記的csv文件構建的。

現在,我正在考慮對底部的圖表使用plot()函數,對頂部的圖表使用bar()函數。

您認為這行得通嗎? 我應該使用其他東西嗎?

另外,您認為我應該使用plt.subplot()繪制兩個圖表還是應該在同一圖表上繪制兩個圖表?

任何例子都很好。

謝謝您的寶貴時間,ssinfod

我喜歡axhspan的@jcoppens想法。 這是一個在頂部使用bar並在主要圖形上使用step的示例。 頂部的條形圖對應於底部的橙色step圖,綠色條形圖也相似。

條形圖中的橙色或綠色地圖對應於進入的人數(由關聯的step圖中的正值確定-關聯的我是指綠色與綠色,橙色與橙色相關)。 灰度對應於外出的人(由相關的階梯圖中的負值確定)。

在此處輸入圖片說明

生成繪圖的代碼:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as col

hr = ['{num:02d}'.format(num=i) for i in range(24)]
times = ['{0}:00'.format(h) for h in hr ]
tick_location = [t*4 for t in range(24)]

x1 = np.random.randint(-10, 20, 4*24)
x1[0:5] = 0
x1[20:30] = 0
x1[42:57] = 0
x1[69:74] = 0
x2 = np.random.randint(-3, 5, 4*24)
x2[0:25] = 0
x2[48:57] = 0
x2[89:] = 0

您實際上關心的是:

cmap_in_x1 = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'Greens')
cmap_in_x2 = cm.ScalarMappable(col.Normalize(min(x2), max(x2)), 'Oranges')
cmap_out = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'bone')

fig = plt.figure(figsize=(12,8))

big_ax = fig.add_axes([0.1, 0.1, 0.8, 0.6])
plt.grid()

small_ax_1 = fig.add_axes([0.1, 0.7, 0.8, 0.05], sharex=big_ax)
small_ax_2 = fig.add_axes([0.1, 0.75, 0.8, 0.05], sharex=big_ax)

big_ax.step(np.arange(len(x1)), x1, color='lightgreen', alpha=0.8, linewidth=2)
big_ax.step(np.arange(len(x2)), x2, color='orange', alpha=0.5, linewidth=2)

small_ax_1.bar(np.arange(len(x1>0)), x1>0, align='center', alpha=0.8, color=cmap_in_x1.to_rgba(x1))
small_ax_1.bar(np.arange(len(x1<0)), x1<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x1))
small_ax_2.bar(np.arange(len(x2>0)), x2>0, align='center', alpha=0.8, color=cmap_in_x2.to_rgba(x2))
small_ax_2.bar(np.arange(len(x2<0)), x2<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x2))

big_ax.set_xticks(tick_location)
big_ax.set_xticklabels(times, rotation=90)

big_ax.plot(np.zeros(len(x1)), color='black', linewidth=2)

plt.setp(small_ax_1.get_yticklabels(), visible=False)
plt.setp(small_ax_1.get_xticklabels(), visible=False)
plt.setp(small_ax_2.get_yticklabels(), visible=False)
plt.setp(small_ax_2.get_xticklabels(), visible=False)

plt.title('Bus Traffic', fontsize=24)
plt.show()

子圖的想法似乎很好。

對於頂部的圖形,您可能需要考慮使用axhspan而不是條形圖。 鋼筋往往具有相同的寬度,可能會使您的工作復雜化。 使用axhspan,您只需定義要繪制條的位置。

一個簡單的示例是該圖像中的中間條,指示觀察者和發射器站點的日光區域:

在此處輸入圖片說明

代碼是這樣的:

s.axhspan(y1, y2, xmin = 0., xmax = set, ec = 'black', fc = 'white', lw = 1)
s.axhspan(y1, y2, xmin = set, xmax = rise, linewidth=4, color='black', lw = 1)
s.axhspan(y1, y2, xmin = rise, xmax = 1., ec = 'black', fc = 'white', lw = 1)

其中xmin / xmax是白天/晚上的變化(在我的情況下),但將是門的開/關。

情節准備(在我的情節中)是這樣的:

s = plt.subplot(where, ylabel='Sun', xlim = (0., 24.), ylim = (0., 1.), \
                xticks = xticks, \
                yticks = [0.25, 0.75], yticklabels = [id, 'Obs'], \
                axisbg = '#00c000')

並且,在同一圖中繪制兩個條形圖,只是指定它們的高度(ymin和ymax)

暫無
暫無

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

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