比较(八)利用python绘制指示器
比较(八)利用python绘制指示器
指示器(Indicators)简介
指示器是一系列相关图的统称,主要用于突出展示某一变量的实际值与目标值的差异,例如常见的数据delta、仪表盘、子弹图、水滴图等。
快速绘制
-
基于plotly
更多用法可参考Indicators in Python
import plotly.graph_objects as gofig = go.Figure()# 自定义仪表盘 fig.add_trace(go.Indicator(domain = {'row': 0, 'column': 0},value = 450,mode = "gauge+number+delta",title = {'text': "Speed"},delta = {'reference': 380},gauge = {'axis': {'range': [None, 500]},'steps' : [{'range': [0, 250], 'color': "lightgray"},{'range': [250, 400], 'color': "gray"}],'threshold' : {'line': {'color': "red", 'width': 4}, 'thickness': 0.75, 'value': 490}}))# 自定义子弹图 fig.add_trace(go.Indicator(domain = {'x': [0.05, 0.5], 'y': [0.15, 0.35]},mode = "number+gauge+delta", value = 180,delta = {'reference': 200},gauge = {'shape': "bullet",'axis': {'range': [None, 300]},'threshold': {'line': {'color': "black", 'width': 2},'thickness': 0.75,'value': 170},'steps': [{'range': [0, 150], 'color': "gray"},{'range': [150, 250], 'color': "lightgray"}],'bar': {'color': "black"}}))# 基本delta fig.add_trace(go.Indicator(domain = {'row': 0, 'column': 1},mode = "delta",value = 300,))# 自定义delta fig.add_trace(go.Indicator(domain = {'row': 1, 'column': 1},mode = "number+delta",value = 40,))fig.update_layout(grid = {'rows': 2, 'columns': 2, 'pattern': "independent"},template = {'data' : {'indicator': [{'title': {'text': "Speed"},'mode' : "number+delta+gauge",'delta' : {'reference': 90}}]}})
-
基于pyecharts
仪表盘只能居中,无法改变位置。水球图可以通过center参数改变位置。
更多用法可以参考pyecharts-gallery
from pyecharts import options as opts from pyecharts.charts import Gauge, Liquid, Grid, Page# 创建仪表盘图表 g = (Gauge().add("基本仪表盘", [("完成率", 66.6)],title_label_opts=opts.GaugeTitleOpts(font_size=20, offset_center=[0,35]),detail_label_opts=opts.GaugeDetailOpts(formatter='{value}%', offset_center=[0,60]),radius="50%").set_global_opts(legend_opts=opts.LegendOpts(is_show=False),tooltip_opts=opts.TooltipOpts(is_show=True, formatter="{a} <br/>{b} : {c}%")) )# 创建水球图 c = (Liquid().add("lq", [0.6, 0.7], center=["80%", "50%"]) )# 在一个页面中显示两个图表,调整每个图的宽度 grid = (Grid().add(g, grid_opts=opts.GridOpts(pos_left="10%", pos_right="55%")) .add(c, grid_opts=opts.GridOpts(pos_left="60%", pos_right="10%")) )grid.render_notebook()
-
基于matplotlib
参考:Building a Bullet Graph in Python
# 创建子弹图的函数 def bulletgraph(data=None, limits=None, labels=None, axis_label=None, title=None,size=(5, 3), palette=None, formatter=None, target_color="gray",bar_color="black", label_color="gray"):'''data: 需要绘制的数据,通常是一个二维列表,列表的元素为三元组,分别表示图例、目标值和实际值。例如:[["图例A", 60, 75]]limits: 子弹图的分段标准,例如:[20, 60, 100] 表示图形将被分成 <20, 20-60, >60-100 这几个区段labels: 子弹图中每个区段的名称axis_label: x轴的标签title: 图形标题size: 图形大小palette: 子弹图的颜色板formatter: 用于格式化x轴刻度的格式器target_color: 目标值线条的颜色,默认是灰色bar_color: 实际值条形的颜色,默认黑色label_color: 标签文本颜色,默认灰色'''# 确定最大值来调整条形图的高度(除以10似乎效果不错)h = limits[-1] / 10# 默认使用sns的绿色调色板if palette is None:palette = sns.light_palette("green", len(limits), reverse=False)# 如果只有一组数据,创建一个子图;否则,根据数据的数量创建多个子图if len(data) == 1:fig, ax = plt.subplots(figsize=size, sharex=True)else:fig, axarr = plt.subplots(len(data), figsize=size, sharex=True)# 针对每个子图,添加一个子弹图条形for idx, item in enumerate(data):# 从创建的子图数组中获取轴对象if len(data) > 1:ax = axarr[idx]# 格式设置,移除多余的标记杂项ax.set_aspect('equal')ax.set_yticks([1])ax.set_yticklabels([item[0]])ax.spines['bottom'].set_visible(False)ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['left'].set_visible(False)prev_limit = 0# 画出各个区段的柱形图for idx2, lim in enumerate(limits):ax.barh([1], lim - prev_limit, left=prev_limit, height=h,color=palette[idx2]) prev_limit = limrects = ax.patches# 画出表示实际值的条形图ax.barh([1], item[1], height=(h / 3), color=bar_color)# 计算y轴的范围,确保目标线条的长度适应ymin, ymax = ax.get_ylim()# 画出表示目标值的线条ax.vlines(item[2], ymin * .9, ymax * .9, linewidth=1.5, color=target_color) # 添加标签if labels is not None:for rect, label in zip(rects, labels):height = rect.get_height()ax.text(rect.get_x() + rect.get_width() / 2, -height * .4, label, ha='center', va='bottom', color=label_color) # 设置x轴刻度的格式if formatter:ax.xaxis.set_major_formatter(formatter)# 设置x轴的标签if axis_label:ax.set_xlabel(axis_label)# 设置子图的标题if title:fig.suptitle(title, fontsize=14)# 调整子图之间的间隔fig.subplots_adjust(hspace=0)
import matplotlib.pyplot as plt import seaborn as sns from matplotlib.ticker import FuncFormatter import matplotlib as mplplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签# 格式化为货币 def money(x, pos):return "${:,.0f}".format(x) # 通过自定义函数格式化刻度值 money_fmt = FuncFormatter(money)# 自定义数据 data = [("HR", 50000, 60000),("Marketing", 75000, 65000),("Sales", 125000, 80000),("R&D", 195000, 115000)] # 自定义颜色 palette = sns.light_palette("grey", 3, reverse=False)# 绘制子弹图 bulletgraph(data, limits=[50000, 125000, 200000],labels=["Below", "On Target", "Above"], size=(10,5),axis_label="年终预算", label_color="black",bar_color="#252525", target_color='#f7f7f7', palette=palette,title="营销渠道预算绩效",formatter=money_fmt)
定制多样化的指示器
参考:Gauge Chart with Python
利用plotly模拟仪表盘
import plotly.graph_objects as go
import numpy as npplot_bgcolor = "white"
quadrant_colors = [plot_bgcolor, "#f25829", "#f2a529", "#eff229", "#85e043", "#2bad4e"]
quadrant_text = ["", "<b>Very high</b>", "<b>High</b>", "<b>Medium</b>", "<b>Low</b>", "<b>Very low</b>"]
n_quadrants = len(quadrant_colors) - 1current_value = 450
min_value = 0
max_value = 600
# 指针长度
hand_length = np.sqrt(2) / 4
# 指针角度
hand_angle = np.pi * (1 - (max(min_value, min(max_value, current_value)) - min_value) / (max_value - min_value))fig = go.Figure(data=[# 半圆型饼图构造仪表盘go.Pie(values=[0.5] + (np.ones(n_quadrants) / 2 / n_quadrants).tolist(),rotation=90,hole=0.5,marker_colors=quadrant_colors,text=quadrant_text,textinfo="text",hoverinfo="skip",),],layout=go.Layout(showlegend=False,margin=dict(b=0,t=10,l=10,r=10),width=450,height=450,paper_bgcolor=plot_bgcolor,# 注释annotations=[go.layout.Annotation(text=f"Speed Now: {current_value}",x=0.5, xanchor="center", xref="paper",y=0.4, yanchor="bottom", yref="paper",showarrow=False,)],# 指针shapes=[# 圆点go.layout.Shape(type="circle",x0=0.48, x1=0.48,y0=0.52, y1=0.52,fillcolor="#333",line_color="#333",),# 线go.layout.Shape(type="line",x0=0.5, x1=0.5 + hand_length * np.cos(hand_angle),y0=0.5, y1=0.5 + hand_length * np.sin(hand_angle),line=dict(color="#333", width=4))])
)
fig.show()
总结
以上通过plotly、pyecharts和matplotlib绘制了各种各样的指示器。也利用plotly通过自定义方式模拟出仪表盘的效果。
共勉~
相关文章:
比较(八)利用python绘制指示器
比较(八)利用python绘制指示器 指示器(Indicators)简介 指示器是一系列相关图的统称,主要用于突出展示某一变量的实际值与目标值的差异,例如常见的数据delta、仪表盘、子弹图、水滴图等。 快速绘制 基于p…...
【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用
体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板,以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显,提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口,扩展性强&…...
力扣 28找到字符串中第一个匹配项的下标 KMP算法
思路: 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...
JavaScript(10)——匿名函数
匿名函数 没有名字的函数,无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量,并且通过变量名称进行调用 let fn function(){ 函数体 } 调用: fn() 立即执行函数 语法: (function () {…...
图片上传成功却无法显示:静态资源路径配置问题解析
1、故事的背景 最近,有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架,写代码,一顿操作猛如虎,终于将一个简单的壳子搭建完毕。但是在实现功能:点击头像弹出上传图片进行头像替换的时候,卡壳…...
【转盘案例-弹框-修改Bug-完成 Objective-C语言】
一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...
Perl 基础语法
Perl 基础语法 Perl 是一种高级、解释型、动态编程语言,广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法,帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...
【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。 编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以…...
Arduino学习笔记1——IDE安装与起步
一、IDE安装 去浏览器直接搜索Arduino官网,点击Software栏进入下载界面,选择Windows操作系统: 新版IDE下载不需要提前勾选所下载的拓展包,下载好后直接点击安装即可。 安装好后打开Arduino IDE,会自动开始下载所需的…...
一个注解解决重复提交问题
一、前言 在应用系统中提交是一个极为常见的功能,倘若不加管控,极易由于用户的误操作或网络延迟致使同一请求被发送多次,从而生成重复的数据记录。针对用户的误操作,前端通常会实现按钮的 loading 状态,以阻…...
在qt的c++程序嵌入一个qml窗口
//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…...
Vue的依赖注入:组件树中的共享数据与功能
引言 在构建大型前端应用时,组件间的通信和状态共享是一个常见问题。Vue.js 提供了一种类似于 React 的 Context 机制的依赖注入系统,允许开发者在组件树中共享数据和功能。provide 和 inject 是 Vue 依赖注入的两个关键概念。本文将深入探讨 Vue 的依赖注入机制,讨论如何使…...
softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
softmax 函数的多种实现方式 包括纯C语言、C版本、Eigen版本等 flyfish 先看这里Softmax函数介绍 版本1 规矩的写法 #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <cmath>// 计算 softmax 的函…...
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件 读取csv使用base的 read.csv 函数使用 readr 包的 read_csv 函数 读取xlsx使用 xlsx 包的 read.xlsx 函数使用 readxl 包的 read_excel 函数 读取txt使用base的文件读取函数 readLines使用 readr 包的 read_lines 函数 …...
Vue的计算属性和方法有什么区别
Vue中的计算属性(computed)和方法(methods)都是用于处理数据和逻辑的重要特性,但它们之间存在一些关键的区别。以下是两者的主要区别: 1. 缓存性 计算属性:计算属性是基于它们的依赖进行缓存的…...
学生成绩管理系统(C语言)
系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...
C语言 通讯录管理 完整代码
这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…...
2024北京国际智能工厂及自动化展览会亮点前瞻
随着“工业创新,智造未来”的浪潮席卷而来,2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心(顺义新馆)盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果,通过三展联动的创…...
《网络安全等级保护制度详解》
网络安全等级保护制度是我国网络安全领域的一项重要制度,旨在保障网络安全,维护国家安全、社会秩序和公共利益。 网络安全等级保护制度主要包含以下几个关键方面: 等级划分 根据信息系统在国家安全、经济建设、社会生活中的重要程度ÿ…...
使用Wanderboat AI 来规划到巴黎的旅行计划
Wanderboat AI 平台是一个由 GPT-4 驱动的智能旅行规划工具,旨在通过自然对话和多模式互动,为用户提供个性化的旅行行程。以下是该平台的架构和使用方法: 平台架构 GPT-4 驱动:平台利用 GPT-4 的强大自然语言处理能力&#x…...
基于YOLO8的目标检测系统:开启智能视觉识别之旅
文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…...
实验07 接口测试postman
目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…...
C++常用但难记的语法
模板函数的声明和定义必须在同一个文件中。 C中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时…...
Qt 快速保存配置的方法
Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下,Qt界面开发时,快速保存界面上一些参数配置的方法。 因为我在做实验的时候,界面上可能涉及到很多参数的配置,我…...
RKE部署k8s
移除docker(非必要) rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker yum list installed | grep docker yum remove ***rke部署k8s集群 cat > /etc/sysctl.conf << EFO net.ipv4.ip_forward 1 n…...
从0开始的STM32HAL库学习8
PWM控制舵机 配置环境 1. 选择TIM2时钟 2.选择内部时钟模式,打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…...
微信小程序数组绑定使用案例(一)
微信小程序数组绑定案例,修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…...
Kudu节点数规划
作者:南墨 一、概述 由于Kudu是Hadoop生态的一部分(虽然它不依赖于Hadoop生态系统),因此大多数实际应用场景需要的不仅仅是Kudu;为了输入数据,可能需要Kafka、StreamSets或Spark Streaming;对…...
flutter 充电气泡
前言: 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移, 然后和上面的圆圈 会和,感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下,而且气泡 和 气泡直接还可以粘黏 实现原理ÿ…...
【C++】deque以及优先级队列
容器适配器 deque的介绍deque的原理介绍 priority_queue的介绍与使用priority_queue的介绍priority_queue的使用constructor(构造函数)emptypushpoptopsize priority_queue的模拟实现 仿函数何为适配器容器适配器deque的缺陷选择deque作为适配器的理由ST…...
为什么做网站结构优化/泉州seo培训
我将整理文章分享数据工作中的经验,因为业务内容上的差异,可能导致大家的理解不一致,无法体会到场景中的诸多特殊性,不过相信不断的沟通和交流,可以解决很多问题。前面我们分析了职场基本功、数据指标体系,…...
c 做网站好嘛/百度导航最新版本免费下载
http://codeforces.com/problemset/status debug了好久的一份代码。思路简单就是模拟,昨天晚上写的时候脑子短路,写错一个地方然后就不好改了,错误的样例正好还是“IQ0”仿佛在嘲讽着什么hhh,以后可长点心⑧ #include<iostream> #inc…...
做网站包括图片设计吗/设计网站
等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。 WaitForSingleObject 函数DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds ); 第一个参数hObject标识一个能够支持被通知/未通知的内核对象(前面列出的…...
ssh小型购物网站开发/seo项目完整流程
在运维工作中,经常能接到客户的反馈这个:引发类型为“System.OutOfMemoryException”的异常。客户反馈物理内存都还有富余,怎么报内存不足的错误呢! 什么时候会引发System.OutOfMemoryException:操作系统无法满足GC对连…...
网站管理助手 phpmyadmin/网络广告营销方案策划内容
目录 第1章 概览 第2章 存储集群架构 2.1 存储池 2.2 身份认证 2.3 PG(s) 2.4 CRUSH 2.5 I/O操作 2.5.1 副本I/O 2.5.2 纠删码I/O 2.6 自管理的内部操作 2.6.1 心跳 2.6.2 同步 2.6.3 数据再平衡与恢复 2.6.4 校验(或擦除) 2.7 高可用 2.7.1 数据副本 2.7.2 Mon集群 2.7.…...
深圳网站制作必推祥奔科技/推广一般去哪发帖
项目经理和架构师的岗位职责 项目经理和架构师这两个职位虽然在工作内容和职责上不同,但是在国内的企业中这两个职位的职责经常会放在一个人身上,在中小型公司中更是如此,一个人既是项目经理又是系统结构的设计者。在比较正式的企业中&#x…...