python Plotly可视化
文章目录
- Plotly
- 常用函数
- PolarPlotly
- make_subplots
- add_trace
- go.Scatterpolargl
- update_traces
- update_layout
- 综合示例
- 完整版
Python在数据可视化方面有着丰富的库和函数,其中一些常用的库包括
Matplotlib、Seaborn、Plotly、Bokeh
等。
Plotly是一个交互式绘图库,支持创建多种类型的图表,并允许图表在Web浏览器中呈现
Plotly
在Python中,Plotly
的主要接口是plotly.graph_objects
(通常简写为go
),它提供了一系列函数来创建各种类型的图表。
常用函数
go.Line():
绘制折线图
go.Scatter():
绘制散点图
go.Bar():
绘制条形图
go.Histogram():
绘制直方图
go.Box():
绘制箱线图
go.Subplot():
创建子图
fig.update_layout():
设置图表的标题和坐标轴标签
fig.show():
显示图表
PolarPlotly
PolarPlotly 通常指的是使用 Plotly 库在极坐标系统中绘制图形。Plotly 是一个强大的交互式绘图库,支持多种类型的图表,包括极坐标图。
import plotly.graph_objects as go def PolarPlotly(r, theta, mode='lines', line_color='blue', fill_color='none', title='Polar Plot', filename='polar_plot.html'): """ 使用 Plotly 在极坐标中绘制图形。 参数: r (list/array): 半径值列表。 theta (list/array): 极角值列表(以弧度为单位)。 mode (str, 可选): 绘图模式,可以是 'lines', 'markers', 'lines+markers'。默认为 'lines'。 line_color (str, 可选): 线条颜色。默认为 'blue'。 fill_color (str, 可选): 填充颜色。默认为 'none'。 title (str, 可选): 图表标题。默认为 'Polar Plot'。 filename (str, 可选): 保存的 HTML 文件名。默认为 'polar_plot.html'。 """ # 创建极坐标图形对象 fig = go.Figure(data=[go.Scatterpolar( r=r, theta=theta, mode=mode, line=dict(color=line_color), fill='toself' if fill_color != 'none' else 'none', fillcolor=fill_color )]) # 设置图表标题和极坐标轴标签 fig.update_layout( polar=dict( radialaxis=dict( visible=True, range=[min(r) if min(r) > 0 else 0, max(r)] ), angularaxis=dict( thetaunit='radians', rotation=90 ) ), title=title ) # 显示或保存图表 fig.show() fig.write_html(filename) # 示例用法
r = [1, 2, 3, 2, 1]
theta = [0, 0.5*np.pi, np.pi, 1.5*np.pi, 2*np.pi]
PolarPlotly(r, theta, mode='lines+markers', fill_color='lightblue', title='Sample Polar Plot')
1.这个函数依赖于 plotly.graph_objects 模块。
2.r 和 theta 应该是等长的列表或数组。
3.theta 的值应该是以弧度为单位的极角。
4.函数将生成一个交互式图表,并保存为 HTML 文件。
make_subplots
make_subplots 是一个用于创建多子图布局的函数,包括极坐标子图、直角坐标子图等。它允许你在一个图表中组合多个极坐标图或其他类型的子图。
import plotly.subplots as make_subplots # 创建一个包含两个极坐标子图的图表布局
fig = make_subplots(rows=1, cols=2, subplot_titles=('Polar Subplot 1', 'Polar Subplot 2'), polar=True)
add_trace
add_trace 是一个用于向已存在的图表布局中添加迹(trace)的函数。迹是图表中绘制的数据系列。
fig.add_trace(go.Scatterpolar(r=[1, 2, 3], theta=[0, 1.5, 3] * np.pi), row=1, col=1)
go.Scatterpolargl
go.Scatterpolargl 是 Plotly Graph Objects 中用于创建极坐标散点图或线图的一个类。gl 表示它是使用 WebGL 渲染的,通常用于支持大量的数据点。
import plotly.graph_objects as go fig.add_trace(go.Scatterpolargl(r=[1, 2, 3], theta=[0, 1.5, 3] * np.pi, mode='lines+markers'))
mode='lines'|'markers'|'lines+markers', # 绘图模式
update_traces
update_traces 是一个用于更新图表中所有迹的属性的函数。你可以用它来更改多个迹的公共属性,例如颜色、线型等。
fig.update_traces(line_color='red', marker_size=10)
update_layout
update_layout 是一个用于更新图表布局的函数。你可以用它来设置标题、坐标轴标签、图例等。
fig.update_layout( title='My Polar Plot', polar=dict( radialaxis=dict(visible=True, range=[0, 4]), angularaxis=dict(thetaunit='radians', rotation=90) )
)
综合示例
下面是一个综合使用这些函数的示例,创建一个包含单个极坐标子图的图表:
import plotly.graph_objects as go
import numpy as np # 创建极坐标子图布局
fig = make_subplots(rows=1, cols=1, polar=True) # 添加迹
fig.add_trace(go.Scatterpolargl( r=[1, 2, 3, 2, 1], theta=[0, 0.5*np.pi, np.pi, 1.5*np.pi, 2*np.pi], mode='lines+markers', line=dict(color='blue'), fill='toself', fillcolor='lightblue'
)) # 更新迹和布局
fig.update_traces(line_color='red', marker_size=10)
fig.update_layout( title='Polar Plot Example', polar=dict( radialaxis=dict(visible=True, range=[0, 4]), angularaxis=dict(thetaunit='radians', rotation=90) )
) # 显示图表
fig.show()
首先使用 make_subplots 创建了一个极坐标子图布局。然后,我们使用 add_trace 添加了一个 go.Scatterpolargl 迹。接着,我们使用 update_traces 更改了迹的线条颜色和标记大小,并使用 update_layout 设置了图表的标题和极坐标轴的属性。最后,我们使用 show 方法显示了图表。
完整版
import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(os.getcwd())))import re
import gc
import numpy as np
import pandas as pd
import random
import math
import glob
import time
import sys
from itertools import groupby as iter_groupbyimport matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号plt.rcParams['savefig.dpi'] = 100 #图片像素
plt.rcParams['figure.dpi'] = 100 #分辨率import warnings
warnings.filterwarnings("ignore")#dataframe输出时列名对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)pd.set_option('display.width',2000)
'''
原始数据可视化:极坐标动态图
'''
def PolarPlotly(data,rname,anglename,titlesname,groupnames,legendgroupnumber,text,legendtxt='',title='',zname=False):# err:固定误差"""极坐标动态图--------data:dataframername:str,需要画图的列名anglename:str,角度列名titlesname:str,所画的 名称groupnames:list,需要分组的列名legendgroupnumber:int,lengendgroup在groupnames的位置text:list,[文字,col],text的列名legendtxt:legendtext的标注,默认为 ''title='':标题前面要增加的字符"""fig=make_subplots(rows=1,cols=1,specs=[[{'type': 'polar'}]])textcol=[text[1]] if type(text[1])==str else text[1]znamecol=[] if zname==False else znameplot_columns=[rname,anglename]+groupnames+textcol+znamecolplot_columns=list(set(plot_columns))GroupData=data[plot_columns].groupby(groupnames)legendgroupnames=[]for key,MidData in GroupData:if isinstance(key, tuple):legendgroup=str(key[legendgroupnumber])else:legendgroup=str(key)#legendgroup=str(key) if type(key)==str else str(key[legendgroupnumber])showlegend=True if legendgroup not in legendgroupnames else Falser=MidData[rname]theta=MidData[anglename]texts=[text[0]+':'+str(i) for i in MidData[text[1]]]fig.add_trace(go.Scatterpolargl(#'_'.join([str(i) for i in key])r=r,theta=theta,mode='markers',name=legendtxt+legendgroup,showlegend=showlegend,legendgroup=legendgroup,text=texts#go.scattergl:大容量数据,showlegend=False),row=1,col=1)if zname !=False:for zn in zname:z=MidData[zn]fig.add_trace(go.Scatterpolargl(#'_'.join([str(i) for i in key])r=z,theta=theta,mode='markers',name=legendtxt+legendgroup+'_'+zn,showlegend=showlegend,legendgroup=legendgroup,text=texts#go.scattergl:大容量数据,showlegend=False),row=1,col=1)legendgroupnames.append(legendgroup)fig.update_traces(mode='markers',marker_size=3)#, marker_line_width=2fig.update_layout(title='{}{}极坐标图'.format(title,titlesname),#yaxis_zeroline=False, #xaxis_zeroline=False,polar = dict(radialaxis_tickfont_size = 8,angularaxis = dict(tickfont_size = 8,rotation = -90,)),polar2 = dict(radialaxis_tickfont_size = 8,angularaxis = dict(tickfont_size = 8,rotation = -90,)),width=1000,height=800,#xaxis_title='角度',#yaxis_title='随机误差(mm)',template='plotly_white')#template换主题return figdef ScatterPlotly(data,xname,yname,xtitle,ytitle,groupnames,legendgroupnumber,text,legendtxt='',title='',zname=False):# err:固定误差"""散点图动态图--------data:dataframexname:str,需要画图的x轴列名yname:str,需要画图的y轴列名xtitle:strytitle:strgroupnames:list,需要分组的列名legendgroupnumber:int,lengendgroup在groupnames的位置text:list,[文字,col]legendtxt:legendtext的标注,默认为 ''title='':标题前面要增加的字符zname:列表xyname:列表,另外的xname,yname"""fig=go.Figure()textcol=[text[1]] if type(text[1])==str else text[1]znamecol=[] if zname==False else znameplot_columns=[xname,yname]+groupnames+textcol+znamecolplot_columns=list(set(plot_columns))GroupData=data.groupby(groupnames)legendgroupnames=[]for key,MidData in GroupData:if isinstance(key, tuple):legendgroup=str(key[legendgroupnumber])else:legendgroup=str(key)showlegend=True if legendgroup not in legendgroupnames else Falsex=MidData[xname]y=MidData[yname]texts=[str(text[0])+':'+str(i) for i in MidData[text[1]].values.tolist()]#texts=[text[0]+str(i) for i in MidData[text[1]]]fig.add_trace(go.Scattergl(x=x,y=y,mode='markers',name=legendtxt+legendgroup,showlegend=showlegend,legendgroup=legendgroup,text=texts#go.scattergl:大容量数据,showlegend=False),)if zname !=False:for zn in zname:z=MidData[zn]fig.add_trace(go.Scattergl(x=x,y=z,mode='markers',name=legendtxt+legendgroup+'_'+zn,showlegend=showlegend,legendgroup=legendgroup,text=texts#go.scattergl:大容量数据,showlegend=False),)legendgroupnames.append(legendgroup)fig.update_traces(mode='markers',marker_size=3)#, marker_line_width=2fig.update_layout(title='{}{}和{}的散点图'.format(title,xtitle,ytitle),yaxis_zeroline=False, xaxis_zeroline=False,width=1000,height=600,xaxis_title=xtitle,yaxis_title=ytitle,template='plotly_white')#template换主题return fig
代码块解析:
for key,MidData in GroupData:if isinstance(key, tuple):legendgroup=str(key[legendgroupnumber])else:legendgroup=str(key)
'''
这段代码是Python中的一部分,它遍历一个名为GroupData的可迭代对象(可能是一个列表、元组或其他可迭代对象),该对象包含键值对。对于GroupData中的每一对键值对,它都会执行一些操作,具体取决于键的类型。for key, MidData in GroupData:这一行是一个for循环,用于遍历GroupData中的每一项。它假设GroupData是一个由键值对组成的可迭代对象,如列表的列表、元组的元组等。每次迭代中,key会被赋值为当前的键,MidData会被赋值为对应的值。
if isinstance(key, tuple):这一行检查key是否是一个元组。isinstance()函数用于检查对象的类型是否是指定类型(在这种情况下是元组)。
legendgroup=str(key[legendgroupnumber])如果key是一个元组,这一行会执行。它取key中的第legendgroupnumber个元素(这里假设legendgroupnumber是一个已定义的变量),并将其转换为字符串。然后,它将这个字符串赋值给legendgroup变量。
else:如果key不是一个元组,那么会执行这个else块。
legendgroup=str(key)在else块中,key被转换为字符串,并赋值给legendgroup变量。
这段代码的主要目的是根据key的类型(是否是元组)来设置legendgroup变量的值。如果key是元组,它会取元组中的特定元素;否则,它会直接使用key的值。这通常用于数据可视化中,特别是在设置图例组(legend group)时,根据数据的不同属性(如类别、分组等)来区分不同的数据系列。
'''
相关文章:
python Plotly可视化
文章目录 Plotly常用函数PolarPlotlymake_subplotsadd_tracego.Scatterpolarglupdate_tracesupdate_layout综合示例 完整版 Python在数据可视化方面有着丰富的库和函数,其中一些常用的库包括 Matplotlib、Seaborn、Plotly、Bokeh等。 Plotly是一个交互式绘图库&…...
刷题第10天
代码随想录刷题第10天 |● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 239. 滑动窗口最大值 唉,好难,先记个思路吧 class Solution { private:class MyQueue { //单调队列(从大到小)public:deque<int> que; // 使用deq…...

Bililive-go 实现直播自动监控录制
前言 最近有直播录制的需求,但是自己手动录制太麻烦繁琐,于是用了开源项目Bililive-go进行全自动监控录制,目前这个项目已经有3K stars了 部署 为了方便我使用了docker compose 部署 version: 3.8 services:bililive:image: chigusa/bilil…...

【Redis】Redis持久化模式RDB
目录 引子 RDB RDB的优缺点 小节一下 引子 不论把Redis作为数据库还是缓存来使用,他肯定有数据需要持久化,这里我们就来聊聊两种持久化机制。这两种机制,其实是 快照 与 日志 的形式。快照:就是当前数据的备份,我可以拷贝到磁…...
Java基础 - 模拟医院挂号系统
模拟医院挂号系统功能 1. 科室管理:新增科室,删除科室(如果有医生在,则不能删除该科室),修改科室 2. 医生管理:录入医生信息以及科室信息,修改医生信息(主要是修改个人…...

【论文精读】基于知识图谱关系路径的多跳智能问答模型研究
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

uni app 微信小程序微信支付
使用方法 接口传参 使用wx.requestPayment方法是一个统一各平台的客户端支付API,不管是在某家小程序还是在App中,客户端均使用本API调用支付...

Dgraph 入门教程一《 概览》
1、Dgraph的特点 (1) 分布式规模:可以发布和处理大量数据 (2)支持GraphQL:一种内置的查询语法,类似SQL。可以让数据操作起来更简单 (3)完全的事务处理和ACID兼容:满足OLTP工作负载,该负载要求频繁的插入和更新数据。 (4)支持多…...

VSCode安装
前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器,支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…...

STM32各外设初始化步骤
1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…...
10. Nginx进阶-Return
简介 什么是Return? nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作,如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…...

Nircmd集成定时执行专家之后的使用场景
Nircmd工具拥有了定时执行功能之后,可以用于以下场景: 1. 自动化日常工作 定时清理系统垃圾文件定时备份重要文件定时关闭或重启电脑定时发送邮件或短信定时执行其他程序或脚本 2. 监控系统状态 定时检查系统温度定时检查磁盘空间定时检查网络连接定时…...
Java面试题【必知必会】Linux常用命令面试题(2024)
近期一直在准备面试,所以为了巩固知识,也为了梳理,整理了一些java的基础面试题!同时也希望各位英雄和女侠能够补充!不胜荣幸!!! 名称地址Java面试题【必知必会】基础(202…...

元宇宙融合多功能气膜馆:开启娱乐与文化的数字新纪元
多功能气膜馆和元宇宙的结合,标志着娱乐和文化领域进入了全新的时代。元宇宙作为数字化空间的前沿概念,正在逐渐渗透到人们的日常生活中。而多功能气膜馆作为一种创新的场馆模式,则为人们提供了更为丰富多彩的娱乐和文化体验。这种融合不仅将…...

微信小程序本地开发
微信小程序本地开发时不需要在小程序后台配置服务器域名直接在小程序项目中填写后端在本机的IP地址和端口号 如图(第一步) 填写地址后发现报错,url不是合法域名,则在详情设置不校验合法域名 如图(第二歩)…...

2024火爆全网系列,原来RocketMQ中间件可以这么玩
前言 做了 3~5 年编程开发,你已经积累了不少项目经验,扩宽了技术广度,也许已发力成为团队管理者。到了这个阶段,大家却常有这种感受:感觉自己卡在瓶颈进步缓慢,技术水平很难像早期一样实现大幅突破&#x…...

2024阿里、网易、京东等大厂最新Java面试题,一举拿下腾讯美团滴滴offer
前言 一位小伙伴准备了许久的阿里Java面试,原以为能够顺利拿下offer,但在第三面还是被摁在地上反复摩擦,丧气一段时间后,小伙伴调整了心态重新尝试了一下,最终拿下了offer,今天小编把这位小伙伴遇到的面试…...
我的创作纪念日(2024.3.6)
机缘 从2020.10.11号进入博客,刚开始我只是把博客当作类似于微博的网站,用的比较少,后来到公司之后,开始使用博客进行做笔记,把工作上遇到的问题都记录下来,这样后面再遇到同样的问题就可以通过自己以前做…...
SpringBoot实战(1)
SpringBoot总结 一,Spring 设计思想 OOP: 面向对象编程-》封装、继承、多态 BOP: 面向Bean编程-》一切从Bean开始 AOP: 面向切面编程-》解藕、专 人做专事 IOC: 控制反转,将new 对象的操作交给Spring统一管理-》转交控制权 DI/DL: 依赖注入/依赖查找-》自动赋值 DI和AOP…...

Dgraph 入门教程二《 快速开始》
1、Clound 云 云地址:Dgraph Cloud 登录Clound 云后,可以用云上的东西操作,可以用谷歌账号或者github账号登录。 启动云 (1)在云控制台,点击 Launch new backend. (2)选择计划&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...