干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏) (4)

对于为绘图创建数据集的函数,我们需要允许指定每个参数。 为了告知我们如何在make_dataset 函数中转换数据,我们可以加载所有相关数据并进行检查。

image12-加载数据

在此数据集中,每行是一个单独的航班。 arr_delay 列是以分钟为单位的航班到达延迟(负数表示航班早到)。 从前面的描述中我们知道有 327,236 个航班,最小延迟为 -86 分钟,最大延迟为 +1272 分钟。 在 make_dataset 函数中,我们希望根据 dataframe 中的 name 列选择航空公司,并通过 arr_delay 列限制航班数量。

为了生成直方图的数据,我们使用 numpy 中的 histogram 函数来计算每个bin中的数据点数。在示例中,这是每个指定延迟间隔内的航班数量。 在前面内容中,为所有航班制作了直方图,但现在我们将针对每个航空公司进行。 由于每个航空公司的航班数量差异很大,我们可以按比例显示延迟,而不是原始计数。 也就是说,图上的高度表示的是,在相应的 bin 区间,特定航空公司中该航班相对应于所有航班的延迟比例。 为了从计数到比例,我们将计数除以该航空公司的航班总数。

下面是制作数据集的完整代码,该函数接收我们想要包括的航空公司列表,要绘制的最小和最大延迟,以及以分钟为单位的指定 bin 宽度。

def make_dataset(carrier_list, range_start = -60, range_end = 120, bin_width = 5): # Check to make sure the start is less than the end! assert range_start < range_end, "Start must be less than end!" by_carrier = pd.DataFrame(columns=[\'proportion\', \'left\', \'right\', \'f_proportion\', \'f_interval\', \'name\', \'color\']) range_extent = range_end - range_start # Iterate through all the carriers for i, carrier_name in enumerate(carrier_list): # Subset to the carrier subset = flights[flights[\'name\'] == carrier_name] # Create a histogram with specified bins and range arr_hist, edges = np.histogram(subset[\'arr_delay\'], bins = int(range_extent / bin_width), range = [range_start, range_end]) # Divide the counts by the total to get a proportion and create df arr_df = pd.DataFrame({\'proportion\': arr_hist / np.sum(arr_hist), \'left\': edges[:-1], \'right\': edges[1:] }) # Format the proportion arr_df[\'f_proportion\'] = [\'%0.5f\' % proportion for proportion in arr_df[\'proportion\']] # Format the interval arr_df[\'f_interval\'] = [\'%d to %d minutes\' % (left, right) for left, right in zip(arr_df[\'left\'], arr_df[\'right\'])] # Assign the carrier for labels arr_df[\'name\'] = carrier_name # Color each carrier differently arr_df[\'color\'] = Category20_16[i] # Add to the overall dataframe by_carrier = by_carrier.append(arr_df) # Overall dataframe by_carrier = by_carrier.sort_values([\'name\', \'left\']) # Convert dataframe to column data source return ColumnDataSource(by_carrier)

上述运行结果如下:

image13-整理好的数据

提醒一下,我们使用 Bokeh 中 quad 函数来制作直方图,因此我们需要提供该图形符号的左、右和顶部(底部将固定为0)参数。 它们分别位于 “left”,“right” 和 “proportion” 列中。 color 列为每个显示的航空公司提供了唯一的颜色,f_ 列为 tooltips 提供了格式化文本。

下一个要实现的功能是 make_plot 。 该函数应该采用 ColumnDataSource(Bokeh中用于绘图的特定类型的对象)并返回绘图对象:

def make_plot(src): # Blank plot with correct labels p = figure(plot_width = 700, plot_height = 700, title = \'Histogram of Arrival Delays by Carrier\', x_axis_label = \'Delay (min)\', y_axis_label = \'Proportion\') # Quad glyphs to create a histogram p.quad(source = src, bottom = 0, top = \'proportion\', left = \'left\', right = \'right\', color = \'color\', fill_alpha = 0.7, hover_fill_color = \'color\', legend = \'name\', hover_fill_alpha = 1.0, line_color = \'black\') # Hover tool with vline mode hover = HoverTool(tooltips=[(\'Carrier\', \'@name\'), (\'Delay\', \'@f_interval\'), (\'Proportion\', \'@f_proportion\')], mode=\'vline\') p.add_tools(hover) # Styling p = style(p) return p

如果我们导入所有航空公司的数据,绘制的图形如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdsj.html