美文网首页Python编程进阶
实战|学会使用Boken实现数据可视化(四)

实战|学会使用Boken实现数据可视化(四)

作者: python与数据分析 | 来源:发表于2021-01-05 15:16 被阅读0次

    利用bokeh实现联动交互,悬浮、滑块、下拉菜单,如下图所示:


    from bokeh.io import output_notebook, show, curdoc
    from bokeh.plotting import figure
    from bokeh.models import HoverTool, ColumnDataSource, Select
    from bokeh.models import CategoricalColorMapper
    from bokeh.palettes import Spectral6
    from bokeh.layouts import row, column
    from bokeh.models import Slider
    import pandas as pd
    data = pd.read_csv('./demo.csv')
    
    # 制作 ColumnDataSource: source
    source = ColumnDataSource(data={
        'x': data[data.Year == 1970].fertility,
        'y': data[data.Year == 1970].life,
        'country': data[data.Year == 1970].Country,
        'pop': (data[data.Year == 1970].population / 20000000) + 2,
        'region': data[data.Year == 1970].region,
    })
    # 保存 fertility 列的最大值和最小值: xmin, xmax
    xmin, xmax = min(data.fertility), max(data.fertility)
    # 保存 life expectancy 列的最大值和最小值: ymin, ymax
    ymin, ymax = min(data.life), max(data.life)
    # 列出 region 列中的唯一值: regions_list
    regions_list = data.region.unique().tolist()
    # 制作颜色映射器: color_mapper
    color_mapper = CategoricalColorMapper(factors=regions_list, palette=Spectral6)
    # 创建画布: plot
    plot = figure(title='Gapminder Data for 1970', plot_height=400, plot_width=700,
                  x_range=(xmin, xmax), y_range=(ymin, ymax))
    # 将颜色映射器添加到圆形字形
    plot.circle(x='x', y='y', fill_alpha=0.8, source=source,
                color=dict(field='region', transform=color_mapper), legend_label='region')
    # 设置 x 轴标签
    plot.xaxis.axis_label = 'Fertility (children per woman)'
    # 设置 y 轴标签
    plot.yaxis.axis_label = 'Life Expectancy (years)'
    # 创建图例位置 'top_right'
    plot.legend.location = 'top_right'
    # 定义回调函数: update_plot
    def update_plot(attr, old, new):
        # 将 yr 名称设置为 slider.value,将 new_data 设置为 source.data
        yr = slider.value
        x = x_select.value
        y = y_select.value
        # Label axes of plot
        plot.xaxis.axis_label = x
        plot.yaxis.axis_label = y
        # Set new_data
        new_data = {
            'x'       : data[data.Year == yr][x],
            'y'       : data[data.Year == yr][y],
            'country' : data[data.Year == yr].Country,
            'pop'     : (data[data.Year == yr].population / 20000000) + 2,
            'region'  : data[data.Year == yr].region,
        }
        source.data = new_data
        # Set the range of all axes
        plot.x_range.start = min(data[x])
        plot.x_range.end = max(data[x])
        plot.y_range.start = min(data[y])
        plot.y_range.end = max(data[y])
        # Add title to figure
        plot.title.text = 'Gapminder data for %d' % yr
    ### 添加滑块
    # 制作滑块对象: slider
    slider = Slider(start=1970, end=2010, step=1, value=1970, title='Year')
    # 将回调附加到滑块的'value'属性
    slider.on_change('value', update_plot)
    ### 添加悬停工具
    # 创建一个悬停工具: hover
    hover = HoverTool(tooltips=[('Country', '@country')])
    # 在图片中添加悬停工具
    plot.add_tools(hover)
    ### 添加下拉菜单
    # 创建 x 的下拉菜单 : x_select
    x_select = Select(
        options=['fertility', 'life', 'child_mortality', 'gdp'],
        value='fertility',
        title='x-axis data'
    )
    # 将 update_plot 回调附加到 x_select 的 'value' 属性
    x_select.on_change('value', update_plot)
    # 创建 y 的下拉菜单: y_select
    y_select = Select(
        options=['fertility', 'life', 'child_mortality', 'gdp'],
        value='life',
        title='y-axis data'
    )
    # 将 update_plot 回调附加到 y_select 的 'value' 属性
    y_select.on_change('value', update_plot)
    layout = row(column(slider, x_select, y_select), plot)
    curdoc().add_root(layout)
    curdoc().title = 'Gapminder'
    

    希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。

    相关文章

      网友评论

        本文标题:实战|学会使用Boken实现数据可视化(四)

        本文链接:https://www.haomeiwen.com/subject/cpxwoktx.html