2017-09-13 14 views
0

私はMatplotlibでチャネル占有プロットを作成しようとしています。私がしようとしていることを説明しましょう。Matplotlib:Channel Occupation Plot from Lists

言って、私は次のリストで定義された二つの異なる当事者によって占有されている通信チャネル(例えば、電話回線)を持つ:

occupation_start_times = [[1,2,3],[1.5,2.5,3.5]] 
occupation_durations = [[0.3,0.2,0.2],[0.4,0.2,0.1]] 

だから基本的にパーティ1は、1から1.3までのチャンネルを占有し、 2〜2.2および3〜3.2、パーティ2は1.5〜1.9などである。

私は、チャネル占有の各期間がバー(または、むしろ長方形の形)によって表される別個の水平に整列した領域を持っていたいと思います。複数の当事者が同時にチャンネルをつかむかもしれないので、私は各パーティーのような別個のプロットが必要です。

すでに私はthisと考えていましたが、問題は、チャネルがその当事者によって押収されない時間によって中断された複数のバーではなく、1つのパーティーあたり1つの水平バーがあることです。

+1

私はあなたが[この例](https://matplotlib.org/examples/pylab_examples/broken_barh.html)のようなガント・チャートのいくつかの種類を探していることを推測します。実装に問題がある場合は、問題の[mcve]が必要です。 – ImportanceOfBeingErnest

答えて

0

こんにちは私は@ImportanceOfBeingErnestのリンクに基づいて私の問題を解決することができました! myplotクラスの

Picture

一部が...ただ、すべてのself sおよびimport matplotlib.pyplot as pltを削除し、あなたのニーズにカスタマイズし、ほら!

def broken_barh(self): 
    plot_data = [] 
    for index,item in enumerate(self.data["occupation_starting"]): 
     plot_data.append(list(zip(self.data["occupation_starting"][index], self.data["occupation_durations"][index]))) 

    print("plot_data:") 
    #print(plot_data) 
    data_len = len(plot_data) 
    print(data_len) 

    self.ax.set_ylim(5, 5*data_len+15) 
    self.ax.set_xlim(0, self.timer*self.repetitions) 
    self.ax.xaxis.grid(self.grid) 
    self.ax.yaxis.grid(self.grid) 

    # FIXME: Now ACKS are absolutely required, or data_len/2 doesn't make sense! 
    self.ax.set_yticks([x*10+15 for x in range(int(data_len/2))]) 
    #self.ax.set_yticklabels(["measurement "+str(self.measurement[index]) for index in range(int(data_len/2))]) 

    self.setLabels(
     xlabel="time[s]", 
     title=self.title 
    ) 

    blue_patch = mpatches.Patch(color='blue', label="Data") 
    red_patch = mpatches.Patch(color='red', label='Acks') 

    if self.legend_coordinates[2] != "best": 
     self.ax.legend(handles=[red_patch, blue_patch], 
         fancybox=True, 
         loc=self.legend_coordinates[2], 
         bbox_to_anchor=(self.legend_coordinates[0], 
             self.legend_coordinates[1])) 
    else: 
     self.ax.legend(handles=[red_patch, blue_patch], 
         fancybox=True, 
         loc="best") 

    for index,item in enumerate(plot_data): 
     print("Added index "+str(index)+" to plot.") 
     if index % 2 == 0: 
      self.ax.broken_barh(item,((index+1)*5+5, 9), facecolors='blue') 
     elif (index-1) % 2 == 0: 
      self.ax.broken_barh(item,(index*5+5,9), facecolors='red')