网站首页 > 技术文章 正文
关于pyecharts
pyecharts是一个用于生成echart(百度开源的数据可视化javascript库)图表的类库。pyecharts 分为 v0.5.x 和 v1.x 两个大版本,版本不兼容,本篇所有的案例基于v1.6.2。
回到顶部
柱状图
# 柱状图
import random
import pyecharts.options as opts
from pyecharts.charts import Bar
x_vals = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
bar = (
Bar()
.add_xaxis(x_vals)
.add_yaxis('商家A', [random.randint(10, 100) for _ in range(6)])
.add_yaxis('商家B', [random.randint(10, 100) for _ in range(6)])
.add_yaxis('商家C', [random.randint(10, 100) for _ in range(6)])
.add_yaxis('商家D', [random.randint(10, 100) for _ in range(6)])
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=14),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=40, name="达标线=40")]))
.set_global_opts(title_opts=opts.TitleOpts(title='柱状图示例-销量', subtitle='四个商家'),
xaxis_opts=opts.AxisOpts(name='商品'),
yaxis_opts=opts.AxisOpts(name='单位:件'))
)
bar.render('柱状图.html')
回到顶部
堆叠柱状图
# 柱状堆叠图
import pyecharts.options as opts
from pyecharts.charts import Bar
goods = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
bar = (
Bar()
.add_xaxis(goods)
.add_yaxis('商家A', [random.randint(10, 100) for _ in range(6)], stack='stack1')
.add_yaxis('商家B', [random.randint(10, 100) for _ in range(6)], stack='stack1')
.add_yaxis('商家C', [random.randint(10, 100) for _ in range(6)], stack='stack1')
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title='柱状堆叠图示例-商品销量'),
xaxis_opts=opts.AxisOpts(name='品类'),
yaxis_opts=opts.AxisOpts(name='销量(单位:件)'))
)
bar.render('柱状堆叠图.html')
回到顶部
条形图
# 条形图
x_vals1 = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
x_vals2 = ['POLO', '篮球鞋', '羽绒服', '皮鞋', '领带', '睡衣']
x_vals3 = ['羽毛球服', '羽毛球鞋', '护腕', '护膝', '护踝', '毛巾']
y_vals = [random.randint(10, 100) for _ in range(18)]
bar = Bar().add_xaxis(x_vals1 + x_vals2 + x_vals3)
bar.add_yaxis('商家A', y_vals,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='average'),
opts.MarkPointItem(type_='max'),
opts.MarkPointItem(type_='min')],
symbol_size=80)
)
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right'))
bar.set_global_opts(title_opts=opts.TitleOpts(title='条形图示例-商品销量', subtitle='条目较多条形图比较好看点'))
bar.reversal_axis() #翻转XY轴,将柱状图转换为条形图
bar.render('条形图.html')
回到顶部
直方图
# 直方图
# 直方图
import random
import pyecharts.options as opts
from pyecharts.charts import Bar
x_vals = ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
xlen = len(x_vals)
# 设置成两种颜色
y_vals = []
for idx, item in enumerate(x_vals):
if idx % 2 == 0:
y_vals.append(
opts.BarItem(
name = item,
value = random.randint(10, 100),
itemstyle_opts = opts.ItemStyleOpts(color="#749f83"),
)
)
else:
y_vals.append(
opts.BarItem(
name = item,
value = random.randint(10, 100),
itemstyle_opts = opts.ItemStyleOpts(color="#d48265"),
)
)
bar_histogram = (
Bar()
.add_xaxis(x_vals)
.add_yaxis('商家A', y_vals, category_gap=0)
# .add_yaxis('商家A', [random.randint(10, 100) for _ in range(6)], category_gap=0)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=14))
.set_global_opts(title_opts=opts.TitleOpts(title='直方图示例-选择赠品', subtitle=''),
xaxis_opts=opts.AxisOpts(name='赠品类型'),
yaxis_opts=opts.AxisOpts(name='选择相应赠品的人数'))
)
bar_histogram.render('直方图.html')
回到顶部
帕累托图(复合图)
# 帕累托图--# 左边纵坐标表示频数,右边纵坐标表示频率.分析线表示累积频率
import random
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
import pandas as pd
# 随机颜色, from faker
def rand_color() -> str:
return random.choice(
[
"#c23531",
"#2f4554",
"#61a0a8",
"#d48265",
"#749f83",
"#ca8622",
"#bda29a",
"#6e7074",
"#546570",
"#c4ccd3",
"#f05b72",
"#444693",
"#726930",
"#b2d235",
"#6d8346",
"#ac6767",
"#1d953f",
"#6950a1",
]
)
df_origin = pd.DataFrame({'categories':['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],'sales': [random.randint(10, 100) for _ in range(6)]})
print(df_origin)
# 按销量降序排列
df_sorted = df_origin.sort_values(by='sales' , ascending=False)
print(df_sorted)
# 折线图x轴
x_line_categories = [*range(7)]
# 折线图y轴--向下累积频率
cum_percent = df_sorted['sales'].cumsum() / df_sorted['sales'].sum() * 100
cum_percent = cum_percent.append(pd.Series([0])) # 添加起始频率0
cum_percent = cum_percent.sort_values(ascending=True)
print(df_sorted.categories.values.tolist())
print(cum_percent.values.tolist())
def pareto_bar() -> Bar:
line = (
Line()
.add_xaxis(x_line_categories)
.add_yaxis("累计百分比",
cum_percent.values.tolist(),
xaxis_index=1,
yaxis_index=1, # 使用次y坐标轴,即bar中的extend_axis
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True,
)
)
bar = (
Bar()
.add_xaxis(df_sorted.categories.values.tolist())
.add_yaxis('销售额', df_sorted.sales.values.tolist(), category_gap=0)
# .add_yaxis('总额百分比', cum_percent.values.tolist())
.extend_axis(xaxis=opts.AxisOpts(is_show=False, position='top'))
.extend_axis(yaxis=opts.AxisOpts(axistick_opts=opts.AxisTickOpts(is_inside=True), # 刻度尺朝内
axislabel_opts=opts.LabelOpts(formatter='{value}%'), position='right') )
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=14))
.set_global_opts(title_opts=opts.TitleOpts(title='帕累托图示例-销售额', subtitle=''),
xaxis_opts=opts.AxisOpts(name='商品类型', type_='category'),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value} 件")
)
)
)
bar.overlap(line)
return bar
pareto_bar().render('帕累托图.html')
回到顶部
饼图
# 饼图
from pyecharts import options as opts
from pyecharts.charts import Page, Pie
pie = (
Pie()
.add('鼠标选中分区后的tip',
[list(z) for z in zip(['20{}年第{}季'.format(year,season)
for year in [19, 20] # count 2
for season in range(1,5)] # count 2
,[random.randint(2, 10) for _ in range(8)])]) # count 8
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {c}万套'))
.set_global_opts(title_opts=opts.TitleOpts(title='饼图实例-近两年季度销售'),
legend_opts=opts.LegendOpts(is_show=False))
)
pie.render('饼图.html')
回到顶部
圆环图
from pyecharts.charts import Pie
pie = (
Pie()
.add(
'鼠标选中分区后的tip',
[list(z) for z in zip(['20{}年第{}季'.format(year,season)
for year in [19, 20] # count 2
for season in range(1,5)] # count 2
,[random.randint(2, 10) for _ in range(8)])],
radius=['50%', '75%'], #设置内径外径
label_opts=opts.LabelOpts(is_show=True)
)
.set_global_opts(title_opts=opts.TitleOpts(title='圆环图示例-近两年季度销售'),
legend_opts=opts.LegendOpts(is_show=False))
)
pie.render('圆环图.html')
回到顶部
玫瑰图
# 玫瑰图
from pyecharts.charts import Pie
pie = (
Pie()
.add(
'鼠标选中分区后的tip',
[list(z) for z in zip(['20{}年第{}季'.format(year,season)
for year in [19, 20] # count 2
for season in range(1,5)] # count 2
,[random.randint(0, 10) for _ in range(8)])],
radius=['10%', '75%'], #设置内径外径
# rosetype='radius' 圆心角展现数据百分比,半径展现数据大小
# rosetype='area' 圆心角相同,为通过半径展现数据大小
rosetype='radius',
label_opts=opts.LabelOpts(is_show=True)
)
.set_global_opts(title_opts=opts.TitleOpts(title='玫瑰图示例-近两年季度销售'),
legend_opts=opts.LegendOpts(is_show=False))
)
pie.render('玫瑰图.html')
回到顶部
折线图
# 折线图
import random
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode
line = (
Line()
.add_xaxis(['{}月第{}周周赛'.format(y,z)
for y in range(1, 3) # 1、2月
for z in range(1, 5)]) # 1-4周
.add_yaxis('A题', [random.randint(10, 20) for _ in range(8)],
is_smooth=True, # 平滑
markpoint_opts=opts.MarkPointOpts(
# 使用coord这个属性设置自定义标记点数值,我这儿随便写
data=[opts.MarkPointItem(name='自定义标记点',coord=[2,18],value='标注值')]
)
)
.add_yaxis('B题', [random.randint(5, 20) for _ in range(8)])
.add_yaxis('C题', [random.randint(5, 20) for _ in range(8)])
.set_series_opts(label_opts=opts.LabelOpts(
formatter=JsCode( # 通过定义JavaScript回调函数自定义标签
"function(params){"
"return params.value[1].toString() + '%';}" # 外层单引号内存双引号亲测不行!
)
))
.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), # 设置x轴标签旋转角度
yaxis_opts=opts.AxisOpts(name='AC率', min_=3),
title_opts=opts.TitleOpts(title='折线示例_ACM题目分析'))
)
line.render('折线图.html')
回到顶部
折线面积图
# 折线面积图
import random
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode
line = (
Line()
.add_xaxis(['{}月第{}周周赛'.format(y,z)
for y in range(1, 3) # 1、2月
for z in range(1, 5)]) # 1-4周
.add_yaxis('蔡队',
[random.randint(10, 20) for _ in range(8)],
is_symbol_show=False,
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='average', name='均值'),
opts.MarkPointItem(type_='max', name='最大值'),
opts.MarkPointItem(type_='min', name='最小值')],
symbol_size=50)
)
.add_yaxis('旺神',
[random.randint(6, 20) for _ in range(8)],
is_smooth=True,
is_symbol_show=False,
areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
)
.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), # 设置x轴标签旋转角度
yaxis_opts=opts.AxisOpts(name='完成积分', min_=5),
title_opts=opts.TitleOpts(title='折线面积图示例_周赛分析'))
)
line.render('折线面积图.html')
回到顶部
散点图
# 散点图
from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import pandas as pd
def scatter_simple() -> Scatter:
# 数据源
df = pd.DataFrame({'AC':[21,22,23,24,28,30,34,35,40,44,45], # 刷题数
'ACB':[140,120,380,120,200,190,160,300,300,400,500],
'姓名':['小军','NIL','假冒NOI','小白','弱刚','晓雷','窜天','云云','依图','蔡队','旺神',]})
# inplace=True:不创建新的对象,直接对原始对象进行修改
# 升序
df.sort_values('AC', inplace=True, ascending=True)
c = (
Scatter()
.add_xaxis(df.AC.values.tolist())
.add_yaxis(
'刷题_能力_姓名',
df[['ACB','姓名']].values.tolist(),
label_opts=opts.LabelOpts(
formatter=JsCode(
'function(params){return params.value[2];}' #通过定义JavaScript回调函数自定义标签
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title='散点图示例--ACM集训队队员能力'),
xaxis_opts=opts.AxisOpts(name='AC(刷题数)', type_='value', min_=20), #x轴从20开始,原点不为0
yaxis_opts=opts.AxisOpts(name='ACB(能力值)', min_=100), # y轴起始点的值
legend_opts=opts.LegendOpts(is_show=True)
)
)
return c
scatter_simple().render('散点图.html')
回到顶部
雷达图
# 雷达图
import random
from pyecharts import options as opts
from pyecharts.charts import Page, Radar
def radar_simple() -> Radar:
c = (
Radar()
.add_schema(
# 各项的max_值可以不同
schema=[
opts.RadarIndicatorItem(name='计算几何学', max_=100),
opts.RadarIndicatorItem(name='动态规划', max_=100),
opts.RadarIndicatorItem(name='图论', max_=100),
opts.RadarIndicatorItem(name='搜索', max_=100),
opts.RadarIndicatorItem(name='模拟', max_=100),
opts.RadarIndicatorItem(name='数论', max_=100),
]
)
.add('旺神', [[random.randint(10, 101) for _ in range(6)]],
color='red',
areastyle_opts = opts.AreaStyleOpts( #设置填充的属性
opacity = 0.5,
color='red'
),)
.add('蔡队', [[random.randint(10, 101) for _ in range(6)]],
color='blue',
areastyle_opts = opts.AreaStyleOpts(
opacity = 0.5,#透明度
color='blue'
),)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title='雷达图示例-ACM集训队队员能力'))
)
return c
radar_simple().render('雷达图.html')
回到顶部
箱线图
# 箱线图--描述离散程度
from pyecharts import options as opts
from pyecharts.charts import Boxplot
def boxpolt_base() -> Boxplot:
v_sophomore = [
[1.1, 2.2, 2.6, 3.2, 3.7, 4.2, 4.7, 4.7, 5.5, 6.3, 8.0],
[2.5, 2.5, 2.8, 3.2, 3.7, 4.2, 4.7, 4.7, 5.5, 6.3, 7.0]
]
v_junior = [
[3.6, 3.7, 4.7, 4.9, 5.1, 5.2, 5.3, 5.4, 5.7, 5.8, 5.8],
[3.6, 3.7, 4.7, 4.9, 5.1, 5.2, 5.3, 5.4, 5.7, 5.8, 5.8]
]
# 最小值,下四分位数,中位数、上四分位数、最大值
# [min, Q1, median (or Q2), Q3, max]
c = (
Boxplot()
.add_xaxis(['寒假作业','暑假作业'])
.add_yaxis('大二队员', Boxplot.prepare_data(v_sophomore))
.add_yaxis('大三队员', Boxplot.prepare_data(v_junior))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title='ACM集训队祖传练习完成时长离散度'),
xaxis_opts=opts.AxisOpts(name='单位:小时'),
legend_opts=opts.LegendOpts(is_show=True))
.reversal_axis() #翻转XY轴
)
return c
boxpolt_base().render('箱线图.html')
回到顶部
词云图
# 词云图
from pyecharts import options as opts
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType
words = [
('背包问题', 10000),
('大整数', 6181),
('Karatsuba乘法算法', 4386),
('穷举搜索', 4055),
('傅里叶变换', 2467),
('状态树遍历', 2244),
('剪枝', 1868),
('Gale-shapley', 1484),
('最大匹配与匈牙利算法', 1112),
('线索模型', 865),
('关键路径算法', 847),
('最小二乘法曲线拟合', 582),
('二分逼近法', 555),
('牛顿迭代法', 550),
('Bresenham算法', 462),
('粒子群优化', 366),
('Dijkstra', 360),
('A*算法', 282),
('负极大极搜索算法', 273),
('估值函数', 265)
]
def wordcloud_base() -> WordCloud:
c = (
WordCloud()
.add("", words, word_size_range=[20, 100], shape=SymbolType.ROUND_RECT)
.set_global_opts(title_opts=opts.TitleOpts(title='WordCloud示例-OJ搜索关键字'))
)
return c
wordcloud_base().render('词云图.html')
猜你喜欢
- 2024-10-31 如何实现鼠标绘制三角形? 鼠标三角形显示怎样才能增大
- 2024-10-31 CADCAM软件应用试题 cadcam题库
- 2024-10-31 视觉SLAM中闭环检测算法的研究 什么是闭环测试
- 2024-10-31 |期刊分享|SLAM|不到200行C代码的CoreSLAM
- 2024-10-31 纹理贴图原理与实践【Texture Mapping】
- 2024-10-31 算力平台跑出200FPS!已知最快最精确的视觉SLAM!吊打ORB+VINS!
- 2024-10-31 利用html canvas实践三角形光栅化
- 2024-10-31 wu反走样画线算法的实现 wu反走样算法绘制直线
- 2024-10-31 OpenGL绘制城堡报告加源码计算机图形学 城堡
- 2024-10-31 圆生成算法 圆的生成方式有哪三种
你 发表评论:
欢迎- 02-20利用神经网络模型检测摄像头上的可疑行为
- 02-20直击心灵:高频核心听力你了解吗?_高频听力的正常范围值是多少
- 02-20YOLOv8 POSE+XGBoost进行人体姿态检测
- 02-20100个篮球英文术语详细解释,从此听懂NBA解说
- 02-20最全紧固件中英文对照,外贸必备词典一
- 02-20带你开发一个视频动态手势识别模型
- 02-20详细介绍一下Java基础中HashMap如何进行扩容操作?
- 02-20GTX 1070 Ti显卡评测:你会购买哪一款?
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)