我试图用Matplotlib创建一个频道占用情节。让我解释一下我要做的事情。
说,我有一个通信渠道(例如电话线),由以下列表定义的两个不同方占用:
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.3,2到2.2和3到3.2,第2方从1.5到1.9等等。
对于每一方,我希望有一个独特的水平对齐区域,其中每个通道占用周期由条形(或者更确切地说是矩形)表示。我需要为每一方提供这样一个独特的情节,因为多方可能同时抓住该频道。
我已经考虑了this,但问题是每个派对只有一个水平条,而不是被该方没有抓住该频道的时间中断的多个小节。
答案 0 :(得分:0)
嘿,我能够根据@ImportanceOfBeingErnest的链接解决我的问题!
myplot类的一部分...只需移除所有self
和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')