当前位置: 首页 > 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;选择计划&…...

PyTorch实战:手把手教你实现MobileFaceNet人脸识别模型(附完整代码)

PyTorch实战&#xff1a;从零构建MobileFaceNet人脸识别系统 人脸识别技术正在从实验室走向日常生活&#xff0c;而MobileFaceNet作为轻量级模型的代表&#xff0c;在移动端和嵌入式设备上展现出惊人的潜力。今天我们将深入探讨如何用PyTorch实现这个高效的神经网络架构&#x…...

从选型到焊接:一份给嵌入式新手的晶振避坑指南(含32.768KHz实例)

从选型到焊接&#xff1a;嵌入式开发者的晶振实战避坑手册 第一次点亮自己设计的电路板时&#xff0c;那颗小小的晶振就像电子世界的心跳起搏器。记得三年前我为一个智能家居项目调试STM32时&#xff0c;连续三天卡在"晶振不起振"的问题上——电路图反复检查无误&…...

3步搞定黑苹果配置:OpCore-Simplify自动化工具如何解决90%的安装难题

3步搞定黑苹果配置&#xff1a;OpCore-Simplify自动化工具如何解决90%的安装难题 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 开篇&#xff1a;黑苹…...

终极指南:如何使用Python实现同花顺自动化程序交易

终极指南&#xff1a;如何使用Python实现同花顺自动化程序交易 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化投资领域&#xff0c;自动化交易已成为专业投资者的标准配置。本文将详细介绍如何利用jqk…...

【flash-attn安装成功却import失败?一个ABI参数引发的‘血案’】

1. 为什么flash-attn安装成功却import失败&#xff1f; 最近在部署Llama2模型时&#xff0c;遇到了一个让人抓狂的问题&#xff1a;明明用pip安装了flash-attn&#xff0c;执行import时却报错提示找不到这个包。更诡异的是&#xff0c;pip list明明显示安装成功了&#xff0c;…...

Kivy中文显示乱码?3步搞定字体配置(附免费字体下载)

Kivy中文显示乱码&#xff1f;3步搞定字体配置&#xff08;附免费字体下载&#xff09; 当你在Kivy应用中看到中文变成一堆问号或方框时&#xff0c;别急着怀疑人生——这通常是字体配置的小问题。作为Python生态中最受欢迎的跨平台GUI框架之一&#xff0c;Kivy默认使用Roboto字…...

YOLO-v8.3镜像实测体验:环境一致性有保障,团队协作更高效

YOLO-v8.3镜像实测体验&#xff1a;环境一致性有保障&#xff0c;团队协作更高效 如果你正在寻找一个开箱即用的YOLOv8开发环境&#xff0c;那么YOLO-v8.3镜像绝对值得一试。作为一名长期从事计算机视觉开发的工程师&#xff0c;我最近对这个镜像进行了全面测试&#xff0c;发…...

在QT中将多个项目(同代码不同ui和资源文件)合并

Linux下的qt环境 我现在有三个项目&#xff0c;代码一模一样&#xff0c;只有UI文件和资源文件不同现在想要合并代码 后期好上传在git 仅需要一个分支 更好管理将随行 康养 采图三个项目代码合并 思路是这样的 将每个项目都分类打包区分开我是在康养这个项目的基础上合…...

Linux文件搜索工具FSearch:从卡顿到闪电的搜索体验革新

Linux文件搜索工具FSearch&#xff1a;从卡顿到闪电的搜索体验革新 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 在Linux系统中&#xff0c;文件搜索往往是一场与时…...

英雄联盟ChampR助手:5分钟快速上手,轻松获取专业出装符文

英雄联盟ChampR助手&#xff1a;5分钟快速上手&#xff0c;轻松获取专业出装符文 【免费下载链接】champ-r &#x1f436; Yet another League of Legends helper 项目地址: https://gitcode.com/gh_mirrors/ch/champ-r 还在为每次游戏都要手动查找英雄出装和符文而烦恼…...