概述
2022/11/3更新:又写了一篇:https://blog.csdn.net/pxy7896/article/details/127636133
2022/5/8 更新:抓取数据的代码可以私信我获取。点赞+私信我邮箱,我会尽快处理!请合理合法使用!
最近在b站抓了一些数据(后面我会写抓取过程这里审核老是不过,我放弃了。反正就用beautifulsoup,然后注意分析链接就好了。以后不写了 ),顺便用pyecharts画了下图。
用这个包,一来是客户要求,二来是省心、省事。这里简单贴一下代码吧。
安装
pip install pyecharts
测试环境:python3 + win10
折线+柱状图
别看这个图挺复杂的,其实只要准备好数据,设置好,这些响应式的浮窗、阴影全都是自动配置的,非常省心。
# name_list, bofang, danmu, zhuifan, pts_list都是list类型
# 它们的元素类型可以是'123'这种,不要求一定是float或者int
def draw_triple_bar_plot():
bar = (
# 柱状图大小
Bar(init_opts=opts.InitOpts(width="1500px", height="700px"))
# 将动漫名设置为x轴
.add_xaxis(name_list)
# 3个bar
.add_yaxis(series_name="播放量",
y_axis=bofang,
label_opts=opts.LabelOpts(is_show=True),)
.add_yaxis(series_name="弹幕量",
y_axis=danmu,
label_opts=opts.LabelOpts(is_show=True),)
.add_yaxis(series_name="追番量",
y_axis=zhuifan,
label_opts=opts.LabelOpts(is_show=True),)
.extend_axis(
# 这里是右侧的y轴
# 用min_和max_设置范围,避免折线太高或太低
yaxis=opts.AxisOpts(
name="综合得分", type_="value", min_=70000, max_=4500000,
)
)
.set_global_opts(title_opts=opts.TitleOpts(title="动漫排行榜前15名播放、弹幕和追番情况"),
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis"),
xaxis_opts=opts.AxisOpts(
# 旋转一下x轴的label,使之可以完整显示
axislabel_opts={"rotate": 16},
# category就是离散值了
type_="category",
axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow")
),
# 这里设置的是左侧的y轴
yaxis_opts=opts.AxisOpts(
name="数量",
# 当bar的y值超出max_时,bar会顶到头。但是因为显示数字所以Ok
max_=8000,
# 添加单位
axislabel_opts=opts.LabelOpts(formatter="{value} 万")
),
)
)
# 折线图
line = (Line()
.add_xaxis(name_list)
.add_yaxis(series_name='综合得分',
yaxis_index=1,
y_axis=pts_list,
label_opts=opts.LabelOpts(is_show=False),
)
)
# 把折线图叠到条形图上面
bar.overlap(line)
# 保存为html文件
bar.render("综合评分与播放弹幕追番-柱状图.html")
堆叠柱状图(stack bar plot)
# 我的data是一个字典,格式:{2:{'4':100, '5':100, '6':100}}
def draw_level_score_stack_plot(data, title):
list1 = []
list2 = []
list3 = []
x_labels = []
# 由于Pie.py中,显示用户的等级只有4,5,6三个值,所以这里仅使用了这三个等级绘制stack bar plot。如果数据发生变化,请修改
for d in data:
x_labels.append(str(d[0]) + '分')
if d[0] == 10:
list1.append(d[1]['4'] / 100)
list2.append(d[1]['5'] / 100)
list3.append(d[1]['6'] / 100)
else:
list1.append(d[1]['4'])
list2.append(d[1]['5'])
list3.append(d[1]['6'])
# 绘图
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(x_labels) # x轴标签
# stack="stack1"表示堆叠,否则是上一部分那种普通柱状图
.add_yaxis("4级", list1, stack="stack1", category_gap="50%") # 柱状的间距
.add_yaxis("5级", list2, stack="stack1", category_gap="50%")
.add_yaxis("6级", list3, stack="stack1", category_gap="50%")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title=title,
# 其实也可以设置提示。但是我选择用副标题
subtitle="评分为10的显示的是除以100的结果",
),
)
.render(title + ".html")
)
嵌套饼图
这里做了一个嵌套饼图。外圈是性别,对于每个性别,在内圈分别指出对应的等级分布。
def draw_pie_plot_sex_level():
# 这里是获取数据
# 格式是:[[label1, num], [label2, num]]
whole, default, male, female = groupby_sex_data()
c = (
Pie(init_opts=opts.InitOpts(
width="900px",
height="800px",
theme=ThemeType.SHINE))
# 内部饼图
.add(
series_name="等级",
center=["50%", "35%"],
data_pair=default + male + female,
radius=[0, "30%"],
label_opts=opts.LabelOpts(position="outside") # 标签设置在内部
)
# 外部饼图
.add(
series_name="性别", # 系列名称
center=["50%", "35%"],
radius=["40%", "55%"], # 饼图半径 数组的第一项是内半径,第二项是外半径
data_pair=whole,
label_opts=opts.LabelOpts(position="outside") # 标签设置在内部
)
.set_global_opts(title_opts=opts.TitleOpts(pos_left="right", title="用户性别及等级分布饼图"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
# 全局配置项
c.set_global_opts(legend_opts=opts.LegendOpts(
pos_left="left",
orient="vertical"))
c.render("用户性别及等级分布饼图.html")
词云图
import pyecharts.options as opts
from pyecharts.charts import WordCloud
import pymysql
import jieba
def select_data(key):
conn = pymysql.connect(host="localhost", user="root", passwd='XXXX', db="bilibili")
cur = conn.cursor()
sql = "select " + key + " from TableName;"
cur.execute(sql)
word_dic = {}
# sql语句执行后返回结果集
title = cur.fetchall()
# 关闭连接
cur.close()
conn.close()
for data in title:
# jieba分词
ls = jieba.lcut(data[0])
for i in ls:
# 字符统计
word_dic[i] = word_dic.get(i, 0) + 1
return word_dic
def draw(word_dic, title):
# 通过列表推导式构造键值对
data = [(key, value) for key, value in word_dic.items()]
(
WordCloud()
# series_name:添加标题
# word_size_range :词的大小范围
.add(series_name="词云分析", data_pair=data, word_size_range=[40, 100])
.set_global_opts(
title_opts=opts.TitleOpts(
# 标题字体大小
title=title, title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
tooltip_opts=opts.TooltipOpts(is_show=True),
)
# 保存为html网页
.render(title + ".html")
)
最后
以上就是快乐蜗牛为你收集整理的python-pyecharts绘图:折线柱状图+堆叠柱状图+嵌套饼图+词云图的全部内容,希望文章能够帮你解决python-pyecharts绘图:折线柱状图+堆叠柱状图+嵌套饼图+词云图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复