python-pyecharts绘图:折线柱状图+堆叠柱状图+嵌套饼图+词云图

20230704更新

获取数据的代码在这里:https://github.com/pxy7896/PlayWithPython3
最近没有review,如果有问题自己搜索调试吧。

2022/11/3更新:又写了一篇:https://blog.csdn.net/pxy7896/article/details/127636133

最近在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")
    )
  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值