python基于Bokeh库制作子弹图及瀑布图示例教程

目录
  • 子弹图
  • 瀑布图

首先,让我们进行导入并使 Bokeh 的输出显示在我们的笔记本中:

from bokeh.io import show, output_notebook
from bokeh.palettes import PuBu4
from bokeh.plotting import figure
from bokeh.models import Label

output_notebook()

子弹图

在这个例子中,我们将用 python 列表填充数据。 我们可以修改它以适应Pandas数据框,但我们将坚持使用简单的 Python 数据类型作为本示例:

data= [("John Smith", 105, 120),
       ("Jane Jones", 99, 110),
       ("Fred Flintstone", 109, 125),
       ("Barney Rubble", 135, 123),
       ("Mr T", 45, 105)]

limits = [0, 20, 60, 100, 160]
labels = ["Poor", "OK", "Good", "Excellent"]
cats = [x[0] for x in data]

一个棘手的代码部分,是在 y 轴上的 cat 变量中构建一个类别列表。

下一步是创建散景图并设置几个与 x 轴和网格线显示方式相关的选项。 如上所述,我们使用cats变量来定义y_range中的所有类别。

p=figure(title="Sales Rep Performance", plot_height=350, plot_width=800, y_range=cats)
p.x_range.range_padding = 0
p.grid.grid_line_color = None
p.xaxis[0].ticker.num_minor_ticks = 0

下一部分将使用散景的 hbar 创建彩色范围条。 为了完成这项工作,我们需要定义每个条的左右范围以及颜色。 我们可以使用python的zip函数来创建我们需要的数据结构。

zip(limits[:-1], limits[1:], PuBu4[::-1])

# 结果如下:
[(0, 20, '#f1eef6'),
 (20, 60, '#bdc9e1'),
 (60, 100, '#74a9cf'),
 (100, 160, '#0570b0')]

以下是如何将它们组合在一起以创建颜色范围。

for left, right, color in zip(limits[:-1], limits[1:], PuBu4[::-1]):
	p.hbar(y=cats, left=left, right=right, height=0.8, color=color)

结果如下:

我们使用类似的过程,为每个性能度量添加一个黑条。

perf = [x[1] for x in data]
p.hbar(y=cats, left=0, right=perf, height=0.3, color="black")

我们需要添加的最后一个标记是一个显示目标值的段。

comp = [x[2]for x in data]
p.segment(x0=comp, y0=[(x, -0.5) for x in cats], x1=comp,
          y1=[(x, 0.5) for x in cats], color="white", line_width=2)

结果如下:

最后一步是为每个范围添加标签。 我们可以使用 zip 来创建我们需要的标签结构,然后将每个标签添加到布局中。

for start, label in zip(limits[:-1], labels):
    p.add_layout(Label(x=start, y=0, text=label, text_font_size="10pt",
                       text_color='black', y_offset=5, x_offset=15))

结果如下:

瀑布图

构造数据框,用于作为演示的数据框。

# Create the initial dataframe
index = ['sales','returns','credit fees','rebates','late charges','shipping']
data = {'amount': [350000,-30000,-7500,-25000,95000,-7000]}
df = pd.DataFrame(data=data,index=index)

# Determine the total net value by adding the start and all additional transactions
net = df['amount'].sum()

结果如下:

最终的瀑布代码将要求我们为每个段定义几个附加属性,包括:

起始位置;

条形颜色;

标签位置;

标签文字;

通过将其添加到单个数据框中,我们可以使用 Bokeh 的内置功能来简化最终代码。

对于下一步,我们将添加运行总计、段开始位置和标签的位置。

df['running_total'] = df['amount'].cumsum()
df['y_start'] = df['running_total'] - df['amount']

# Where do we want to place the label?
df['label_pos'] = df['running_total']

接下来,我们在包含净值的数据框底部添加一行。

df_net = pd.DataFrame.from_records([(net, net, 0, net)],
                                   columns=['amount', 'running_total', 'y_start', 'label_pos'],
                                   index=["net"])
df = df.append(df_net)

对于这个特定的瀑布,我希望将负值设置为不同的颜色,并设置图表下方的标签格式。 让我们使用值向数据框中添加列。

df['color'] = 'grey'
df.loc[df.amount < 0, 'color'] = 'red'
df.loc[df.amount < 0, 'label_pos'] = df.label_pos - 10000
df["bar_label"] = df["amount"].map('{:,.0f}'.format)

这是包含我们需要的所有数据的最终数据框。 确实需要对数据进行一些操作才能达到这种状态,但它是相当标准的 Pandas 代码,如果出现问题,很容易调试。

创建实际绘图是相当标准的 Bokeh 代码,因为数据框具有我们需要的所有值。

TOOLS = "box_zoom,reset,save"
source = ColumnDataSource(df)
p = figure(tools=TOOLS, x_range=list(df.index), y_range=(0, net+40000),
           plot_width=800, title = "Sales Waterfall")

通过将 ColumnDataSource 定义为我们的数据框,Bokeh 负责创建所有段和标签,而无需进行任何循环。

p.segment(x0='index', y0='y_start', x1="index", y1='running_total',
          source=source, color="color", line_width=55)

我们将做一些小的格式化来添加标签并很好地格式化 y 轴。

p.grid.grid_line_alpha=0.3
p.yaxis[0].formatter = NumeralTickFormatter(format="($ 0 a)")
p.xaxis.axis_label = "Transactions"

最后一步是使用 LabelSet 将所有标签添加到条形图上。

labels = LabelSet(x='index', y='label_pos', text='bar_label',
                  text_font_size="8pt", level='glyph',
                  x_offset=-20, y_offset=0, source=source)
p.add_layout(labels)

结果如下:

以上就是python基于Bokeh库制作子弹图及瀑布图示例教程的详细内容,更多关于基于Bokeh库制作子弹及瀑布图的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python如何使用bokeh包和geojson数据绘制地图

    最近要绘制伦敦区地图,查阅了很多资料后最终选择使用bokeh包以及伦敦区的geojson数据绘制. bokeh是基于python的绘图工具,可以绘制各种类型的图表,支持geojson数据的读取及绘制地图. 安装bokeh $ pip install bokeh 软件版本 python-3.7.7bokeh-2.0.0 数据来源 伦敦地图数据来源于Highmaps地图数据集.下载的是英国的地图数据united-kindom.geo.json.需要对得到的数据进行预处理才能得到只含伦敦地区的数据.这

  • Python中GeoJson和bokeh-1的使用讲解

    GeoJson 文档 { "type": "FeatureCollection", "features": [ { "geometry": { "type": "Polygon", "coordinates": [ [ [ 3, 1 ], [ 3, 2 ], [ 4, 2 ], [ 4, 1 ], [ 3, 1 ] ] ] }, "type": &

  • 浅谈python可视化包Bokeh

    本文研究的主要是python可视化包Bokeh的相关内容,具体如下. 问题:需要把pandas的数据绘图并通过网页显示,matplotlib需要先保存图像,不合适. 解决:在网上搜了一下,找到一篇介绍文章 python可视化工具概述,其中介绍了几个python包,总结如下: Pandas对于简单绘图,可以随手用,但你需要学习定制matplotlib. Seaborn可以支持更多复杂的可视化方式,但仍然需要matplotlib知识,上色功能是个亮点. ggplot有很多功能,但还需要发展. bok

  • Python 数据可视化之Bokeh详解

    目录 安装 散点图 折线图 条形图 交互式数据可视化 Interactive Legends 添加小部件 按钮 复选框 单选按钮 总结 安装 要安装此类型,请在终端中输入以下命令. pip install bokeh 散点图 散点图中散景可以使用绘图模块的散射()方法被绘制.这里分别传递 x 和 y 坐标. 例子: # 导入模块 from bokeh.plotting import figure, output_file, show from bokeh.palettes import magm

  • python数据可视化 – 利用Bokeh和Bottle.py在网页上展示你的数据

    目录 1. 文章重点和项目介绍 2. 数据集研究和图表准备 2.1 导入数据集 2.2 绘制图表 图表1:2019年上海,北京,深圳三地的每天AQI变化曲线 图表2:2019年上海,北京,深圳三地的每月平均AQI对比 图表3:2017年到2019年北京每月平均AQI对比 3. Bottle网页应用 3.1 文件夹结构 3.2 路由 3.3 模板实现 3.4 启动网页服务 4. 将Bokeh和Bottle集成在一起 4.1 模板修改 4.2 Python代码集成 5. 部署应用到Heroku 6.

  • Python库 Bokeh 数据可视化实用指南

    目录 什么是 Bokeh 在哪使用 Bokeh 图 安装Bokeh库 导入Bokeh库 绘制图表的语法 使用Bokeh库主题 图表样式 Python 中的 Bokeh用例 数据 数据说明 饼形图 圆环图 散点图 简单直方图 堆积直方图 不同类型的条形图 简单条形图 堆积条形图 堆积垂直条形图 双向条形图 折线图 棒棒糖图表 面积图 Bokeh库的布局功能 技术交流 什么是 Bokeh Bokeh 是 Python 中的交互式可视化库.Bokeh提供的最佳功能是针对现代 Web 浏览器进行演示的高

  • python基于Bokeh库制作子弹图及瀑布图示例教程

    目录 子弹图 瀑布图 首先,让我们进行导入并使 Bokeh 的输出显示在我们的笔记本中: from bokeh.io import show, output_notebook from bokeh.palettes import PuBu4 from bokeh.plotting import figure from bokeh.models import Label output_notebook() 子弹图 在这个例子中,我们将用 python 列表填充数据. 我们可以修改它以适应Panda

  • Python基于Matplotlib库简单绘制折线图的方法示例

    本文实例讲述了Python基于Matplotlib库简单绘制折线图的方法.分享给大家供大家参考,具体如下: Matplotlib画折线图,有一些离散点,想看看这些点的变动趋势: import matplotlib.pyplot as plt x1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] y1=[30,31,31,32,33,35,35,40,47,62,99,186,480] x2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1

  • Python基于identicon库创建类似Github上用的头像功能

    本文实例讲述了Python基于identicon库创建类似Github上用的头像功能.分享给大家供大家参考,具体如下: Identicon在很多大型IT网站上可以见到,比如Github,Sourceforge,Stackoveflow等等, 刚刚注册的账号的个人信息的默认图标​都​是​一​些​看​上​去​像​七​巧​板​拼​凑​的​图​案​,​对​称​又​变​化​多​端​. 本​人​也​是​因​为​好​奇​才​在​网​上​搜​了​这​个​算​法​,​主​要​是​哈​希​算​法​,​把​邮​箱​或

  • Python基于jieba库进行简单分词及词云功能实现方法

    本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包绘制词云 环境: Python 3.6.0 |Anaconda 4.3.1 (64-bit) 工具: jupyter notebook 从网上下载了一篇小说<老九门>,以下对这篇小说进行分词,并绘制词云图. 分词使用最流行的分词包jieba,参考:https://github.com/fxsjy/

  • python基于pyDes库实现des加密的方法

    本文实例讲述了python基于pyDes库实现des加密的方法.分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要在python中使用des加密,可以直接使用pyDes库加密,该库提供了CBC和ECB两种加密方式. 1.Windows下安装 下载后pyDes-x.x.x.zip并解压后,里面有setup.py文件,使用命令 setup.py --help可查看详细使用. 你可以使用命令python setup.

  • python基于Tkinter库实现简单文本编辑器实例

    本文实例讲述了python基于Tkinter库实现简单文本编辑器的方法.分享给大家供大家参考.具体实现方法如下: ## {{{ http://code.activestate.com/recipes/578568/ (r1) from Tkinter import * from tkSimpleDialog import askstring from tkFileDialog import asksaveasfilename from tkMessageBox import askokcance

  • Python基于sklearn库的分类算法简单应用示例

    本文实例讲述了Python基于sklearn库的分类算法简单应用.分享给大家供大家参考,具体如下: scikit-learn已经包含在Anaconda中.也可以在官方下载源码包进行安装.本文代码里封装了如下机器学习算法,我们修改数据加载函数,即可一键测试: # coding=gbk ''' Created on 2016年6月4日 @author: bryan ''' import time from sklearn import metrics import pickle as pickle

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • Python 基于wxpy库实现微信添加好友功能(简洁)

    Github:https://github.com/Lyo-hub/wxpy_AddFriend 本程序为基于wxpy库实现的. 1.打开cmd导入一下库. 2.修改库文件中add_friend函数,将状态更改为3. 3.正常使用即可 总结 以上所述是小编给大家介绍的Python 基于wxpy库实现微信添加好友功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

  • python 基于selectors库实现文件上传与下载

    server.py import selectors import socket import os import time BASE_DIR =os.path.abspath(os.path.dirname(__file__)) class selectFtpserver: def __init__(self): self.dic = {} # 创建空字典 self.hasReceived = 0 self.hasSend=0 self.sel = selectors.DefaultSelec

随机推荐