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, 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")