You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
6.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from pyecharts import options as opts
from pyecharts.charts import Bar,Page,Line,Timeline
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from pyecharts.charts import Pie
from pyecharts.faker import Faker
from main import book_list_data
from collections import Counter
#book_list_data_sortBystart = sorted(book_list_data, key=lambda x: x.star,reverse=True)
book_list_data_sortBystart = sorted(book_list_data, key=lambda x: (x.star, x.star_people), reverse=True)
book_list_data_sortBystart=book_list_data_sortBystart[:10]
book_list_data_sortBystart=book_list_data_sortBystart[::-1]
# 从book_list_data中提取书籍名称和评分数据
book_names = [book.name for book in book_list_data_sortBystart]
book_stars = [book.star for book in book_list_data_sortBystart]
x_data = list(range(1, len(book_names) + 1))
# 创建柱状图
bar = (
Bar(init_opts=opts.InitOpts(theme="shine",width="850px",height='400px'))
.add_xaxis(book_names)
.add_yaxis("评分", book_stars,color="red")
.reversal_axis() # 实现旋转
.set_global_opts(
title_opts=opts.TitleOpts(title="评分前10榜", pos_bottom="bottom", pos_left="center"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45))
)
# .render("bar_datazoom_slider.html")
)
publisher_list = [book.publisher for book in book_list_data]
# 使用Counter来计算每个出版商的数量
publisher_counter = Counter(publisher_list)
publisher_names = list(publisher_counter.keys())
publisher_counts = list(publisher_counter.values())
colors = [
"#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de",
"#3ba272", "#fc8452", "#9a60b4", "#ea7ccc", "#bb60b4",
"#8B008B", "#FF1493", "#1E90FF", "#20B2AA", "#2E8B57",
"#B22222", "#FF4500", "#4682B4", "#DAA520", "#32CD32"
]
# 使用Pyecharts创建饼图
pie = (
Pie()
.add("", [list(z) for z in zip(publisher_names, publisher_counts)])
.set_colors(colors) # 设置颜色
.set_global_opts(title_opts=opts.TitleOpts(title="出版商分布饼图", pos_left="center",pos_bottom="bottom"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
prices = [float(book.price) for book in book_list_data ]
print(prices)
# 将价格分组到不同的区间
price_intervals = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, float('inf')] # 设置价格区间
price_counts = [0] * (len(price_intervals) - 1) # 初始化每个区间的计数为0
prices_intervalsStr=["0-50","50-100","100-150","150-200","200-250","250-300","300-350","350-400","400-450","450-500","500以上"]
# 统计每个价格区间的数量
for price in prices:
for i in range(len(price_intervals) - 1):
if price>=500:
price_counts[len(price_intervals) - 1] += 1
break
if price_intervals[i] <= price and price < price_intervals[i + 1]:
price_counts[i] += 1
break
# print(price_counts)
# 生成价格区间与书籍数量折线图
line = (
Line()
.add_xaxis([str(interval) for interval in prices_intervalsStr[:-1]]) # X轴标签为价格区间
.add_yaxis("书籍数量", price_counts, symbol="circle", is_smooth=True, markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.set_global_opts(title_opts=opts.TitleOpts(title="价格区间与书籍数量折线图", pos_left="center",pos_bottom="bottom"),
xaxis_opts=opts.AxisOpts(name="价格区间"),
yaxis_opts=opts.AxisOpts(name="书籍数量"),
datazoom_opts=opts.DataZoomOpts(range_start=0, range_end=100),)
)
# 生成时间与书籍数量折线图# 假设您的书籍数据保存在book_list_data中
# 提取每本书的出版年份
publish_dates = [int(book.pub_year.replace('-', '.').split('.')[0]) for book in book_list_data]
print(publish_dates)
# 使用Counter来计算每年出版的书的数量
publish_year_counter = Counter(publish_dates)
print(publish_year_counter)
# 确保结果包含连续的年份范围,并且将缺失的年份对应的数量设为 0
full_year_range = range(min(publish_dates), max(publish_dates) + 1)
print(full_year_range)
pub_year_counts = [(year, publish_year_counter[year]) for year in full_year_range]
# 提取年份和对应的书籍数量
years = [str(year) for year, count in pub_year_counts]
counts = [count for year, count in pub_year_counts]
print(pub_year_counts)
#
# # 创建动态的时间曲线图
# line_year_count = (
# Line()
# .add_xaxis(xaxis_data=years)
# .add_yaxis(
# series_name="出版数量",
# y_axis=counts,
# )
# .set_global_opts(
# title_opts=opts.TitleOpts(title="每年出版书籍数量变化"),
# xaxis_opts=opts.AxisOpts(name="年份"),
# yaxis_opts=opts.AxisOpts(name="书籍数量"),
# datazoom_opts=opts.DataZoomOpts(type_="inside"),
# tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
# )
# )
# timeline = Timeline()
# for i, year in enumerate(years):
line_year_count = (
Line()
.add_xaxis(years)
.add_yaxis(
series_name="出版书籍数量",
y_axis=counts,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")]),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),
)
.set_global_opts(title_opts=opts.TitleOpts(title="年份与出版书籍数量变化"),
xaxis_opts=opts.AxisOpts(name="年份"),
yaxis_opts=opts.AxisOpts(name="书籍数量"),
)
)
# timeline.add(line_year_count, time_point=str(year))
# timeline.add_schema(
# play_interval=1000, # 播放的时间间隔
# is_auto_play=False, # 是否自动播放
# pos_left="center", # 时间轴组件的位置
# pos_bottom="bottom",
# )
# 生成html文件可选
# pie.render("publisher_pie_chart.html")
# 创建一个页面
page = Page()
# 将柱状图和饼图添加到页面中
page.add(line_year_count)
page.add(bar)
page.add(pie)
page.add(line)
# 生成HTML文件
page.render("book_analysis.html")