运行import pandas as pd from pyecharts import options as opts from pyecharts.charts import Line # 读取 Excel 文件并指定列 df = pd.read_excel('所有评论数据(1).xlsx', usecols=[1], engine='openpyxl') # 对数据进行抽样或分组,例如每隔100条数据取一个样本 sampled_df = df.iloc[::100, :] # 创建 Line 图表 line_chart = Line(init_opts=opts.InitOpts(width="1500px", height="700px", )) # 添加数据 x_data = range(len(sampled_df)) # 保留两位小数 y_data = [round(value, 2) for value in sampled_df.iloc[:, 0].tolist()] #line_chart.add_xaxis(x_data) line_chart.add_xaxis(xaxis_data=x_data) # 修改此处,将 x_data 作为 xaxis_data 参数传入 line_chart.add_yaxis("情感倾向", y_data, is_smooth=True, symbol="circle", symbol_size=6) # 设置图表标题和坐标轴标签 line_chart.set_global_opts( title_opts=opts.TitleOpts(title="情感倾向动态图"), xaxis_opts=opts.AxisOpts(name="时间"), yaxis_opts=opts.AxisOpts(name="情感倾向"), ) # 生成 HTML 文件并在浏览器中打开 line_chart.render("3_情感倾向图.html")
时间: 2024-04-08 16:34:31 浏览: 168
这段代码是用来生成一个情感倾向动态图的,它使用了pandas、pyecharts和openpyxl库。
在运行这段代码之前,请确保您已经安装了这些库。如果没有安装,可以使用以下命令来安装它们:
```
pip install pandas
pip install pyecharts
pip install openpyxl
```
另外,请确保您的Python环境中已经有安装了这些库的正确版本。
在您运行这段代码之后,它会读取名为"所有评论数据(1).xlsx"的Excel文件,并从中抽样每隔100条数据取一个样本。然后,它会创建一个Line图表,并添加抽样的数据。最后,它会设置图表的标题和坐标轴标签,并生成一个名为"3_情感倾向图.html"的HTML文件,用于显示这个情感倾向动态图。
如果您在运行过程中遇到任何错误,请提供详细的错误信息,以便我能够更好地帮助您解决问题。
相关问题
# -*- coding: utf-8 -*- import pandas as pd from pyecharts import options as opts from pyecharts.charts import Line,Bar,Funnel,Pie from pyecharts.components import Table from pyecharts.options import ComponentTitleOpts from sqlalchemy import create_engine from pyecharts.charts import Page from pyecharts.charts import WordCloud from collections import Counter import jieba import re # 创建数据库连接 engine = create_engine('mysql+pymysql://root:123456@localhost/doubandata') #1. #2. def line_chart2(): # 从数据库中读取数据 query = "SELECT show_time FROM t_music" df = pd.read_sql(query, engine) # 处理日期数据,提取年份 df['year'] = pd.to_datetime(df['show_time'], errors='coerce').dt.year # 统计每年的歌曲发行数量 year_counts = df['year'].dropna().astype(int).value_counts().sort_index() # 准备数据用于生成折线图 years = year_counts.index.astype(str).tolist() counts = year_counts.values.tolist() # 创建折线图 line = Line(init_opts=opts.InitOpts(width="1600px", height="800px")) line.add_xaxis(years) line.add_yaxis("歌曲发行数量", counts, label_opts=opts.LabelOpts(is_show=True, position="top")) # 设置全局配置项 line.set_global_opts( title_opts=opts.TitleOpts(title="每年歌曲发行数量统计"), xaxis_opts=opts.AxisOpts(type_="category", name="年份"), yaxis_opts=opts.AxisOpts(type_="value", name="发行数量"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross") ) # 渲染图表到HTML文件 line.render("2.song_release_counts_by_year.html") return line #3. def line_chart3(): # 从数据库中读取数据 query = "SELECT show_time, score FROM t_music" df = pd.read_sql(query, engine) # 将 score 列转换为数值类型,无法转换的会变为 NaN df['score'] = pd.to_numeric(df['score'], errors='coerce') # 处理日期数据,提取年份 df['year'] = pd.to_datetime(df['show_time'], errors='coerce').dt.year # 删除无效数据(如日期或评分为空) df = df.dropna(subset=['year', 'score']) # 按年份分组并计算每年的平均评分,保留一位小数 yearly_avg_scores = df.groupby('year')['score'].mean().round(1).sort_index() # 准备数据用于生成折线图 years = yearly_avg_scores.index.astype(int).astype(str).tolist() # 确保年份为整数且不带小数点 avg_scores = yearly_avg_scores.values.tolist() # 创建折线图 line = Line(init_opts=opts.InitOpts(width="1600px", height="800px")) line.add_xaxis(years) line.add_yaxis("平均评分", avg_scores, label_opts=opts.LabelOpts(is_show=True, position="top")) # 设置全局配置项 line.set_global_opts( title_opts=opts.TitleOpts(title="每年歌曲发行的平均评分"), xaxis_opts=opts.AxisOpts(type_="category", name="年份"), yaxis_opts=opts.AxisOpts(type_="value", name="平均评分", min_=7, max_=10), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross") ) # 渲染图表到 HTML 文件 line.render("3.song_release_scores_by_year.html") return line page = Page( page_title="基于Python的豆瓣音乐数据分析与可视化", layout=Page.DraggablePageLayout, # 拖拽方式 ) page.add_js_funcs( """ document.body.style.backgroundColor = '#f0f8ff'; // 设置背景颜色为淡蓝色 """ ) # 添加图表到页面 page.add( # 绘制折线图 line_chart2(), line_chart3(), # 绘制表格 ) # 渲染大屏到临时HTML文件 page.render('大屏_临时1.html') 怎么生成好看个性化的可视化大屏网页
生成个性化、美观的可视化大屏网页需要结合多种技术和工具,以下是详细的步骤及建议:
---
### **1. 设计整体布局**
- 使用 `pyecharts` 提供的 `Page` 类构建整个页面,并设置合理的标题和拖拽模式。
- 可通过 `add_js_funcs()` 自定义 CSS 样式或 JavaScript 功能来美化界面。
**示例代码改进:**
```python
page = Page(
page_title="基于Python的豆瓣音乐数据分析与可视化",
layout=Page.SimplePageLayout, # 或者选择 SimplePageLayout 进行自适应排版
)
# 定义背景样式
page.add_js_funcs("""
document.body.style.backgroundColor = '#2c3e50'; // 背景颜色改为深色主题
""")
```
---
### **2. 增强图表效果**
#### (1) 折线图优化:
可以添加更多交互功能,例如高亮显示、动态加载等。
**改进建议:**
- 修改线条颜色为主题色调(如绿色或橙色),使其更醒目;
- 开启平滑曲线 (`is_smooth`) 和标记点标注关键值。
修改后的折线图部分代码如下:
```python
line = (
Line(init_opts=opts.InitOpts(bg_color="#2c3e50", width="1600px", height="800px"))
.add_xaxis(years)
.add_yaxis(
series_name="歌曲发行数量",
y_axis=counts,
is_smooth=True, # 平滑曲线
label_opts=opts.LabelOpts(color="white"), # 文本颜色设为白色
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]), # 显示最大值点
)
.set_global_opts(
title_opts=opts.TitleOpts(title="每年歌曲发行数量统计", pos_top="1%", pos_left="center"),
legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="white")),
tooltip_opts=opts.TooltipOpts(trigger="item"),
toolbox_opts=opts.ToolboxOpts(is_show=True), # 工具栏选项开启
)
)
```
#### (2) 表格设计:
如果想展示详细数据表,则推荐直接嵌入 HTML `<table>` 元素并通过 `Table` 配置列宽比例。
样例函数如下:
```python
from pyecharts.commons.utils import JsCode
def generate_table():
table_data = [
["Year", "Count"],
[2019, 100],
[2020, 200],
... # 添加实际查询结果填充内容
]
headers = table_data[0]
rows = table_data[1:]
table_component = Table()
table_component.add(headers, rows).set_global_opts(
title_opts=ComponentTitleOpts(title="表格数据概览")
).render_embed() # 返回纯HTML字符串
return table_component
```
将其插入到现有页签里即可。
---
### **3. 整合其他组件提升吸引力**
除了已有的折线图外,还可以补充饼状图、柱形图等形式展现更多信息维度,比如各地区用户占比分析、关键词云热力分布等等...
例子——创建词频统计 + 关键字云图像模块:
```python
def wordcloud_chart():
query = "SELECT intro FROM t_music LIMIT 50"
intros_df = pd.read_sql(query, con=engine)['intro']
all_text = ''.join(map(str.strip,intros_df))
seg_list = jieba.lcut(all_text.replace('\n',' ').replace(' ','')) # 分词处理
c = Counter(seg_list)
words_and_counts = [{"name": w,"value": v} for w,v in dict(c.most_common()).items()]
wc = WordCloud(width="1400px",height="700px").add(series_name="",data_pair=words_and_counts,
word_size_range=[20,100]).set_global_opts(
title_opts=opts.TitleOpts(title="歌词高频词汇词云图")
)
return wc
```
随后将该段落附加至最终呈现列表内:
```python
page.add(... ,wordcloud_chart())
```
---
### **4. 发布上线**
最后一步就是把本地调试完成的作品部署出去让更多人访问啦!可通过 Flask/Django 构建简易服务器发布静态资源;亦或是借助在线托管服务 GitHub Pages/AWS S3 实现免运维维护操作~
完整流程总结下来包括但不限于以下几个要点:
1. 数据采集清洗加工阶段 -> SQL 查询语句编写+Pandas DataFrame 操作技巧学习掌握。
2. 图像渲染制作阶段 -> PyEcharts API 的熟悉程度至关重要。
3. 页面定制化调整阶段 -> 结合前端知识丰富用户体验度。
希望对你有所帮助!
---
import pandas as pd from pyecharts import options as opts from pyecharts.charts import Boxplot, Line, Grid # 读取数据 df = pd.read_excel('200马力拖拉机明细.xlsx') # 创建DataFrame df = pd.DataFrame({ 'FactoryName': df['FactoryName'], 'JiJXH': df['JiJXH'], 'sale': df['sale'] }) # 将FactoryName和JiJXH合并为一列 df['FactoryName-JiJXH'] = df['FactoryName'] + '-' + df['JiJXH'].astype(str) # 对FactoryName-JiJXH进行分组 grouped = df.groupby('FactoryName-JiJXH') # 绘制箱线图 box = Boxplot() box_data = [] for name, group in grouped: box_data.append([round(i, 2) for i in group['sale'].tolist()]) box.add_xaxis([name]) box.add_yaxis('', box.prepare_data(box_data), tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross')) box.set_global_opts( title_opts=opts.TitleOpts(title='Sale Boxplot', subtitle=''), xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(interval=0, formatter='{value|换行}'.replace('换行', '\n')) ) ) box.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 绘制折线图 line = Line() for name, group in grouped: line.add_xaxis([name]) line.add_yaxis('Median', [round(group['sale'].median(), 2)], label_opts=opts.LabelOpts(is_show=False)) line.set_global_opts( title_opts=opts.TitleOpts(title='Sale Median Line', subtitle=''), xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(interval=0, formatter='{value|换行}'.replace('换行', '\n')) ) ) # 合并图表 grid = Grid( init_opts=opts.InitOpts( width='1400px', height='800px', page_title='Boxplot and Median Line', theme='white' ) ) grid.add(box, grid_opts=opts.GridOpts(pos_left='10%', pos_right='10%')) grid.add(line, grid_opts=opts.GridOpts(pos_left='10%', pos_right='10%')) grid.render('boxplot_and_line.html') 提示list index out of range
这个错误通常是由于没有找到所需的列名或行数不够导致的。请确保以下两点:
1. 文件路径正确,确保文件可以正确读取
2. DataFrame 中包含所需的列名
您可以通过在代码中添加一些 `print` 语句来进行调试,以找出问题所在。例如,在 `df` 的创建后,您可以添加下面这行代码来查看 DataFrame 中是否包含所需的列名:
```
print(df.columns)
```
或者您可以在读取 excel 文件之后添加下面这行代码来查看 DataFrame 的行数:
```
print(df.shape[0])
```
希望这可以帮助您找出问题所在。
阅读全文
相关推荐
















