当前位置: 首页 > news >正文

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. 滑动窗口最大值 唉&#xff0c;好难&#xff0c;先记个思路吧 class Solution { private:class MyQueue { //单调队列&#xff08;从大到小&#xff09;public:deque<int> que; // 使用deq…...

Bililive-go 实现直播自动监控录制

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

【Redis】Redis持久化模式RDB

目录 引子 RDB RDB的优缺点 小节一下 引子 不论把Redis作为数据库还是缓存来使用&#xff0c;他肯定有数据需要持久化&#xff0c;这里我们就来聊聊两种持久化机制。这两种机制&#xff0c;其实是 快照 与 日志 的形式。快照:就是当前数据的备份&#xff0c;我可以拷贝到磁…...

Java基础 - 模拟医院挂号系统

模拟医院挂号系统功能 1. 科室管理&#xff1a;新增科室&#xff0c;删除科室&#xff08;如果有医生在&#xff0c;则不能删除该科室&#xff09;&#xff0c;修改科室 2. 医生管理&#xff1a;录入医生信息以及科室信息&#xff0c;修改医生信息&#xff08;主要是修改个人…...

【论文精读】基于知识图谱关系路径的多跳智能问答模型研究

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

uni app 微信小程序微信支付

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

Dgraph 入门教程一《 概览》

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

VSCode安装

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 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&#xff1f; nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作&#xff0c;如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…...

Nircmd集成定时执行专家之后的使用场景

Nircmd工具拥有了定时执行功能之后&#xff0c;可以用于以下场景&#xff1a; 1. 自动化日常工作 定时清理系统垃圾文件定时备份重要文件定时关闭或重启电脑定时发送邮件或短信定时执行其他程序或脚本 2. 监控系统状态 定时检查系统温度定时检查磁盘空间定时检查网络连接定时…...

Java面试题【必知必会】Linux常用命令面试题(2024)

近期一直在准备面试&#xff0c;所以为了巩固知识&#xff0c;也为了梳理&#xff0c;整理了一些java的基础面试题&#xff01;同时也希望各位英雄和女侠能够补充&#xff01;不胜荣幸&#xff01;&#xff01;&#xff01; 名称地址Java面试题【必知必会】基础&#xff08;202…...

元宇宙融合多功能气膜馆:开启娱乐与文化的数字新纪元

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

微信小程序本地开发

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

2024火爆全网系列,原来RocketMQ中间件可以这么玩

前言 做了 3~5 年编程开发&#xff0c;你已经积累了不少项目经验&#xff0c;扩宽了技术广度&#xff0c;也许已发力成为团队管理者。到了这个阶段&#xff0c;大家却常有这种感受&#xff1a;感觉自己卡在瓶颈进步缓慢&#xff0c;技术水平很难像早期一样实现大幅突破&#x…...

2024阿里、网易、京东等大厂最新Java面试题,一举拿下腾讯美团滴滴offer

前言 一位小伙伴准备了许久的阿里Java面试&#xff0c;原以为能够顺利拿下offer&#xff0c;但在第三面还是被摁在地上反复摩擦&#xff0c;丧气一段时间后&#xff0c;小伙伴调整了心态重新尝试了一下&#xff0c;最终拿下了offer&#xff0c;今天小编把这位小伙伴遇到的面试…...

我的创作纪念日(2024.3.6)

机缘 从2020.10.11号进入博客&#xff0c;刚开始我只是把博客当作类似于微博的网站&#xff0c;用的比较少&#xff0c;后来到公司之后&#xff0c;开始使用博客进行做笔记&#xff0c;把工作上遇到的问题都记录下来&#xff0c;这样后面再遇到同样的问题就可以通过自己以前做…...

SpringBoot实战(1)

SpringBoot总结 一,Spring 设计思想 OOP: 面向对象编程-》封装、继承、多态 BOP: 面向Bean编程-》一切从Bean开始 AOP: 面向切面编程-》解藕、专 人做专事 IOC: 控制反转,将new 对象的操作交给Spring统一管理-》转交控制权 DI/DL: 依赖注入/依赖查找-》自动赋值 DI和AOP…...

Dgraph 入门教程二《 快速开始》

1、Clound 云 云地址&#xff1a;Dgraph Cloud 登录Clound 云后&#xff0c;可以用云上的东西操作&#xff0c;可以用谷歌账号或者github账号登录。 启动云 &#xff08;1&#xff09;在云控制台&#xff0c;点击 Launch new backend. &#xff08;2&#xff09;选择计划&…...

文件上传{session文件包含以及条件竞争、图片文件渲染绕过(gif、png、jpg)}

session文件包含以及条件竞争 条件&#xff1a; 知道session文件存储在哪里 一般的默认位置&#xff1a; /var/lib/php/sess_PHPSESSID /var/lib/php/sessions/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID ####在没做过设置的情况下一般都是存储在/var…...

【论文精读】Mask R-CNN

摘要 基于Faster RCNN&#xff0c;做出如下改变&#xff1a; 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支&#xff0c;与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN&#xff0c;以像素到像素的方式预测分割掩码&#xff0c;只增加了很小的计…...

vue + js 项目打包JS、CSS文件自动部署到oss

一、下载oss依赖 npm install webpack-aliyun-oss 或 yarn add webpack-aliyun-oss 二、在vue.config.js中配置文件 const WebpackAliyunOss require("webpack-aliyun-oss");let VUE_APP_BUCKET "xxx"; let VUE_APP_REGION "xx-xxx-xxx";m…...

CSS:让动画流畅生动的缓动函数

在CSS中&#xff0c;可以使用transition属性或者keyframes关键帧动画来创建动画效果。 使用缓动函数则可以让动画更加流畅和生动。 div {transition: <property> <duration> <timing-function> <delay>; }div {animation: <keyframes-name> &l…...

蓝桥杯集训·每日一题2024 (差分)

前言&#xff1a; 差分笔记以前就做了&#xff0c;在这我就不再写一遍了&#xff0c;直接上例题。 例题&#xff1a; #include<bits/stdc.h> using namespace std; int a[10009],b[100009]; int main(){int n,ans10,ans20;cin>>n;for(int i1;i<n;i){cin>>…...

嵌入式通信数据经常说的大端和小端模式(学习)

一.概念 大端模式&#xff08;Big-endian&#xff09;&#xff1a;高位字节排放在内存的低地址端&#xff0c;低位字节排放在内存的高地址端&#xff0c;即正序排列&#xff0c;高尾端&#xff1b; 小端模式&#xff08;Little-endian&#xff09;&#xff1a;低位字节排放在…...

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行&#xff0c;并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容&#xff0c;但并非所…...

阿里云2核4G服务器支持多少人同时在线?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素&#xff1a; 2核4G&#xff1a;2核CPU和4G内存对…...

浏览器发出一个请求到收到响应步骤详解

前言 在网络通信中&#xff0c;浏览器向Web服务器发送HTTP请求消息的过程是一个复杂而精密的环节&#xff0c;涉及到URL解析、DNS解析、数据拆分、路由表规则和MAC头部添加等一系列步骤。本文将深入探讨这一过程的每个环节&#xff0c;帮助读者更全面地了解浏览器与Web服务器之…...

121. 买卖股票的最佳时机【leetcode】/动态规划

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…...