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()