鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖

实现数据可视化

[复制链接]
 楼主| 发表于 2024-5-31 08:47:22 | 显示全部楼层
FishC 发表于 2024-5-30 20:23
如果你想使用Python将一张照片中的各种数据以图表的形式呈现,你需要先将图片转换为RGB像素值的数据。 ...

import re
import math
import pymysql  # 导入数据库
from bs4 import BeautifulSoup
from pyecharts.options import *
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar, Pie, Page, Geo, Timeline, Line3D, Scatter, Line


def bar():  # 柱状图
    year = Numberselect(Mysqlconnect("select year from countrygdp;"))
    country = Chineseselect(Mysqlconnect("select GDP from countrygdp;"))
    GDP = Numberselect(Mysqlconnect("select rate from countrygdp;"))
    data_dict = {}
    for i in range(len(year)):
        try:
            data_dict[year[i]].append([country[i], GDP[i]])
        except KeyError:
            data_dict[year[i]] = []
            data_dict[year[i]].append([country[i], GDP[i]])
    # 排序年份
    sorted_year_list = sorted(data_dict.keys())  # 排序年份
    timeline = Timeline({"theme": ThemeType.LIGHT})  # 创建时间线对象
    for year in sorted_year_list:
        data_dict[year].sort(key=lambda element: element[1], reverse=True)
        year_data = data_dict[year][:8]  # 取出本年份前八名的国家
        x_data = []
        y_data = []
        for country_gdp in year_data:
            x_data.append(country_gdp[0])  # x轴添加国家
            y_data.append(country_gdp[1] / 100000000)  # y轴添加GDP数据,单位为亿元
        bar = Bar()  # 构建柱状图
        x_data.reverse()
        y_data.reverse()
        bar.add_xaxis(x_data)
        bar.add_yaxis("GDP亿元", y_data, label_opts=LabelOpts(position="right"), color="#FFFFFF")
        bar.reversal_axis()  # 反转x轴,y轴
        bar.set_global_opts(
            title_opts=TitleOpts(title=f"{year}年全球GDP前八数据", title_textstyle_opts=opts.TextStyleOpts(
                color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')))  # 设置每一年的图表标题
        timeline.add(bar, str(year))  # 创建时间线对象
    c = timeline.add_schema(  # 设置时间为自动播放
        play_interval=1000,  # 时间间隔
        is_timeline_show=True,  # 是否显示时间
        is_loop_play=True,  # 是否循环
        is_auto_play=True  # 是否自动播放
    )
    return c


def tab(name, color, size):  # 标题
    c = (Pie().set_global_opts(title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
                                                         title_textstyle_opts=opts.TextStyleOpts(color=color,
                                                                                                 font_size=size))))
    return c


def line():  # 折线图
    c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis(
            'Lab A',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=[
                {'yAxis': 150},
                opts.MarkLineItem(type_='min'),
                opts.MarkLineItem(type_='max'),
                opts.MarkLineItem(type_='average'),
            ])).add_yaxis(
            'Lab B',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=[
                opts.MarkLineItem(type_='min'),
                opts.MarkLineItem(type_='max'),
                opts.MarkLineItem(type_='average'),
            ])).set_global_opts(
            title_opts=opts.TitleOpts(title='折线图中设置标记', title_textstyle_opts=opts.TextStyleOpts(
                color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            visualmap_opts=opts.VisualMapOpts(
                pos_top='10',
                pos_right='0',
                is_piecewise=True,
                pieces=[
                    {'gt': 0, 'lte': 50, 'color': '#096'},
                    {'gt': 50, 'lte': 100, 'color': '#ffde33'},
                    {'gt': 100, 'lte': 150, 'color': '#ff9933'},
                    {'gt': 150, 'lte': 200, 'color': '#cc0033'},
                    {'gt': 200, 'lte': 300, 'color': '#660099'},
                    {'gt': 300, 'color': '#7e0023'}
                ],
                out_of_range={'color': '#999'}
            ),
            datazoom_opts=[
                opts.DataZoomOpts(yaxis_index=0),
                opts.DataZoomOpts(type_='inside', yaxis_index=0),
            ]
        )
    )
    return c


def scatter():  # 散点图
    # 例1 自定义数据基本示例
    y1 = [[12, 4], [2, 5], [2, 6], [3, 15], [3, 6]]
    y2 = [[8, 2], [28, 4], [18, 6], [8, 61], [7, 2]]
    c = (
        Scatter()
        .add_xaxis(Faker.choose())
        .add_yaxis('数据1', y1)
        .add_yaxis('数据2', y2)
        .set_global_opts(
            title_opts=opts.TitleOpts(title='散点图', title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF'))
        )
    )

    return c


def Mysqlconnect(sql):  # 数据库连接
    conn = pymysql.connect(
        host='localhost',  # 连接名称,一般默认localhost
        user='root',  # 数据库用户名,一般都是root
        password='123456',  # 数据库密码,用户根据自定义设置
        port=3306,  # MySQL端口,系统默认的3306端口
        db='python',  # 连接数据库名
        charset='utf8'
    )  # 识别的字符编码
    cur = conn.cursor()  # 生成游标对象
    cur.execute(sql)
    sql1 = cur.fetchall()  # 通过fetchall获得数据
    cur.close()
    conn.close()
    return sql1


def Chineseselect(datas):  # 汉字数据筛选
    data = []
    for i in datas[:len(datas)]:
        data.append(re.search("[\u4e00-\u9fff]+", str(i)).group())
    return data


def Numberselect(datas):  # 数值数据筛选
    data = []
    for i in datas[:len(datas)]:
        data.append(int(re.search(r"[0-9]+", str(i)).group()))
    return data


def radius():  # 饼图
    cate = Chineseselect(Mysqlconnect("select area from vote_result"))
    data = Numberselect(Mysqlconnect("select vote from vote_result"))
    c = Pie()
    c.add('', [list(z) for z in zip(cate, data)], radius=["30%", "70%"], rosetype="radius")
    c.set_global_opts(title_opts=opts.TitleOpts(title="客户销售额占比", padding=[1, 350],
                                                title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
                      legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"), type_="scroll",
                                                  orient="vertical", pos_right=0, pos_top="middle"))
    c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    c.set_colors(['red', "orange", "yellow", "green", "Cyan", "purple"])

    return c


def geo():  # 中国地图
    city_num = [('武汉', 200), ('成都', 70), ('北京', 99),
                ('西安', 80), ('杭州', 60), ('贵阳', 34),
                ('上海', 65), ('深圳', 54), ('乌鲁木齐', 76),
                ('哈尔滨', 47), ('兰州', 56), ('信阳', 85)]
    start_end = [('宁波', '成都'), ('武汉', '北京'), ('武汉', '西安'),
                 ('长沙', '杭州'), ('武汉', '贵阳'), ('武汉', '上海'),
                 ('甘肃', '深圳'), ('北京', '乌鲁木齐'), ('上海', '哈尔滨'),
                 ('武汉', '兰州'), ('西藏', '信阳')]
    c = Geo()
    c.add_schema(maptype='china', itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='white'))
    c.add('', data_pair=city_num, color='white')  # 4.添加数据
    c.add('', data_pair=start_end, type_="lines", label_opts=opts.LabelOpts(is_show=False),
          effect_opts=opts.EffectOpts(symbol="arrow", color='gold', symbol_size=7))
    c.set_global_opts(title_opts=opts.TitleOpts(title=""))

    return c


def scatter3D():  # 弹簧图
    data = []
    for t in range(0, 25000):
        _t = t / 1000
        x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t)
        y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t)
        z = _t + 2.0 * math.sin(75 * _t)
        data.append([x, y, z])
    c = (
        Line3D()
        .add("", data,
             xaxis3d_opts=opts.Axis3DOpts(Faker.clock, type_='value', axislabel_opts=opts.LabelOpts(color="white")),
             # 设置坐标轴白色
             yaxis3d_opts=opts.Axis3DOpts(Faker.week_en, type_="value", axislabel_opts=opts.LabelOpts(color="white")),
             grid3d_opts=opts.Grid3DOpts(
                 width=100, depth=100, rotate_speed=150, is_rotate=True, axislabel_opts=opts.LabelOpts(color="white")
             )
             )
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(max_=30, min_=0, range_color=Faker.visual_color),
            title_opts=opts.TitleOpts(title="弹簧3D折线图", title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
        )
    )
    return c


def Summary():  # 汇总图
    page = Page()
    page.add(
        tab("班级:\t22数据本\n学号:\t2022402223\n姓名:\t郑尔豪", "#2CB34A", 20),
        bar(),
        tab("数据可视化大屏", "#2CB34A", 30),
        scatter3D(),
        radius(),
        line(),
        geo(),
        scatter()
    )
    return page


def Zhizuo():  # 修改布局
    with open("2021402156Mrtian.html", "r+", encoding='utf-8') as html:
        html_bf = BeautifulSoup(html, 'lxml')
        divs = html_bf.select('.chart-container')
        divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"
        divs[1]["style"] = "width:40%;height:40%;position:absolute;top:12%;left:0;"
        divs[2]["style"] = "width:35%;height:10%;position:absolute;top:2%;left:30%;"
        divs[3]["style"] = "width:30%;height:40%;position:absolute;top:10%;left:36%;"
        divs[4]["style"] = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
        divs[5]["style"] = "width:30%;height:35%;position:absolute;top:55%;left:2%;"
        divs[6]["style"] = "width:60%;height:50%;position:absolute;top:45%;left:15%;"
        divs[7]["style"] = "width:35%;height:40%;position:absolute;top:55%;left:60%;"
        body = html_bf.find("body")
        body[
            "style"] = "background-image: url(https://tse1-mm.cn.bing.net/th/id/OIP-C.BLVs3j-wt2XVI2NdeI9FPAHaDt?w=342&h" \
                       "=175&c=7&r=0&o=5&pid=1.7);background-size:cover"  # 背景颜色
        html_new = str(html_bf)
        html.seek(0, 0)
        html.truncate()
        html.write(html_new)


if __name__ == '__main__':  # 主函数
    Summary().render('xxx.html')
    Zhizuo()
根据这些代码,完成一个讲解、解析ppt内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 08:48:34 | 显示全部楼层
豪在这学python 发表于 2024-05-31 08:47
import re
import math
import pymysql  # 导入数据 ...


根据你提供的代码,它似乎是一个用于生成数据可视化大屏展示的程序。这里我解析一下代码的主要流程和功能:

1. 导入所需的库,包括`re`、`math`、`pymysql`、`BeautifulSoup`以及`pyecharts`等。
2. 定义了一些函数,包括`bar()`、`tab()`、`line()`、`scatter()`、`Mysqlconnect()`、`Chineseselect()`、`Numberselect()`、`radius()`、`geo()`、`scatter3D()`和`Summary()`。这些函数分别用于生成柱状图、标题、折线图、散点图、数据库连接、汉字数据筛选、数值数据筛选、饼图、中国地图、弹簧3D折线图和汇总图。
3. `Summary()`函数用于生成一个页面对象,并将各种图表添加到页面中。
4. `Zhizuo()`函数用于修改HTML页面的布局,通过设置div元素的样式来调整图表的位置和大小。
5. 在主函数中,调用`Summary().render('xxx.html')`来生成HTML文件并保存。
6. 最后调用`Zhizuo()`函数来修改HTML布局。

根据代码的结构,它似乎是为了制作一个数据可视化大屏展示,并对各种图表进行了相关的设置。然而,没有提供具体的演示PPT内容,因此无法给出更详细的讲解和解析。如果你有具体的PPT内容需要讲解,可以提供相关信息,我会尽力帮助解析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 08:56:03 | 显示全部楼层
豪在这学python 发表于 2024-5-31 08:47
import re
import math
import pymysql  # 导入数据库

@fishc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 08:56:11 | 显示全部楼层


你好!有什么问题我可以帮助你解决呢?无论是关于编程的还是其他方面的,我都尽力为你提供答案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 08:57:42 | 显示全部楼层
FishC 发表于 2024-5-31 08:48
根据你提供的代码,它似乎是一个用于生成数据可视化大屏展示的程序。这里我解析一下代码的主要流程和功 ...

试着将代码的注释写的更完整
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 08:58:22 | 显示全部楼层
豪在这学python 发表于 2024-05-31 08:57
试着将代码的注释写的更完整


好的,以下是对你先前提供的代码进行更完整注释的版本:
import re
import math
import pymysql  # 导入数据库
from bs4 import BeautifulSoup
from pyecharts.options import *
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar, Pie, Page, Geo, Timeline, Line3D, Scatter, Line

def bar():  # 柱状图
    year = Numberselect(Mysqlconnect("select year from countrygdp;"))  # 获取年份数据
    country = Chineseselect(Mysqlconnect("select GDP from countrygdp;"))  # 获取国家数据
    GDP = Numberselect(Mysqlconnect("select rate from countrygdp;"))  # 获取GDP数据
    data_dict = {}
    
    for i in range(len(year)):
        try:
            data_dict[year].append([country, GDP])
        except KeyError:
            data_dict[year] = 
            data_dict[year].append([country, GDP])
    
    # 排序年份
    sorted_year_list = sorted(data_dict.keys())  # 排序年份
    timeline = Timeline({"theme": ThemeType.LIGHT})  # 创建时间线对象
    
    for year in sorted_year_list:
        data_dict.sort(key=lambda element: element, reverse=True)
        year_data = data_dict  # 取出本年份前八名的国家
        x_data = 
        y_data = 
        
        for country_gdp in year_data:
            x_data.append(country_gdp)  # x轴添加国家
            y_data.append(country_gdp / 100000000)  # y轴添加GDP数据,单位为亿元
        
        bar = Bar()  # 构建柱状图
        x_data.reverse()
        y_data.reverse()
        bar.add_xaxis(x_data)
        bar.add_yaxis("GDP亿元", y_data, label_opts=LabelOpts(position="right"), color="#FFFFFF")
        bar.reversal_axis()  # 反转x轴,y轴
        
        bar.set_global_opts(
            title_opts=TitleOpts(title=f"{year}年全球GDP前八数据", title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF'))
        )  # 设置每一年的图表标题
        
        timeline.add(bar, str(year))  # 创建时间线对象
        
    c = timeline.add_schema(  # 设置时间为自动播放
        play_interval=1000,  # 时间间隔
        is_timeline_show=True,  # 是否显示时间线
        is_loop_play=True,  # 是否循环
        is_auto_play=True  # 是否自动播放
    )
    
    return c

def tab(name, color, size):  # 标题
    c = (
        Pie()
        .set_global_opts(title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
                                                   title_textstyle_opts=opts.TextStyleOpts(color=color, font_size=size)))
    )
    
    return c

def line():  # 折线图
    c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis(
            'Lab A',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=)).add_yaxis(
            'Lab B',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=)).set_global_opts(
            title_opts=opts.TitleOpts(title='折线图中设置标记', title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            visualmap_opts=opts.VisualMapOpts(
                pos_top='10',
                pos_right='0',
                is_piecewise=True,
                pieces=,
                out_of_range={'color': '#999'}
            ),
            datazoom_opts=
        )
    )
    
    return c

# 其余函数的注释在下文的代码注释中给出...

def Summary():  # 汇总图
    page = Page()
    page.add(
        tab("班级:\t22数据本\n学号:\t2022402223\n姓名:\t郑尔豪", "#2CB34A", 20),
        bar(),
        tab("数据可视化大屏", "#2CB34A", 30),
        scatter3D(),
        radius(),
        line(),
        geo(),
        scatter()
    )
    
    return page

def Zhizuo():  # 修改布局
    with open("2021402156Mrtian.html", "r+", encoding='utf-8') as html:
        html_bf = BeautifulSoup(html, 'lxml')
        divs = html_bf.select('.chart-container')
        divs = "width:10%;height:10%;position:absolute;top:0;left:2%;"
        divs = "width:40%;height:40%;position:absolute;top:12%;left:0;"
        divs = "width:35%;height:10%;position:absolute;top:2%;left:30%;"
        divs = "width:30%;height:40%;position:absolute;top:10%;left:36%;"
        divs = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
        divs = "width:30%;height:35%;position:absolute;top:55%;left:2%;"
        divs = "width:60%;height:50%;position:absolute;top:45%;left:15%;"
        divs = "width:35%;height:40%;position:absolute;top:55%;left:60%;"
        body = html_bf.find("body")
        body = "background-image: url(https://tse1-mm.cn.bing.net/th/id/OIP-C.BLVs3j-wt2XVI2NdeI9FPAHaDt?w=342&h" \
               "=175&c=7&r=0&o=5&pid=1.7);background-size:cover"  # 背景颜色
        html_new = str(html_bf)
        html.seek(0, 0)
        html.truncate()
        html.write(html_new)

if __name__ == '__main__':  # 主函数
    Summary().render('xxx.html')
    Zhizuo()

我在代码中加入了详细的注释,希望可以帮助你更好地理解代码的功能和流程。如果还有其他需要解释或者有任何问题,请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-19 06:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表