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.

110 lines
3.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.

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from snownlp import SnowNLP
from matplotlib.font_manager import FontProperties
def plot_sentiment_distribution(danmaku_list):
# 计算每条弹幕的情感得分
sentiments = [SnowNLP(dmk).sentiments for dmk in danmaku_list]
# 绘制情感得分直方图
plt.figure(figsize=(10, 6))
plt.hist(sentiments, bins=20, color='lightgreen', edgecolor='black')
plt.xlabel('Sentiment Score')
plt.ylabel('Bullet Screen Count" or "Danmaku Count')
plt.title('Danmaku Sentiment Score Distribution Chart')
plt.show()
def plot_top_danmakus(danmaku_frequency):
# 提取词语和对应的频率
words = list(danmaku_frequency.keys())
frequencies = list(danmaku_frequency.values())
# 绘制柱状图
plt.figure(figsize=(10, 6))
plt.bar(words, frequencies, color='skyblue')
plt.xlabel('Danmaku Words')
plt.ylabel('Frequency of Appearance')
plt.title('High-Frequency Danmaku Words Statistics')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
def create_manual_data():
# 日期列表
date_list = pd.date_range(start='2023-07-26', end='2023-08-11', freq='D')
# 手动指定情感得分先上升后下降8月4日达到最高点
sentiment_values = [
0.5, # 7月26日
0.35, # 7月27日
0.4, # 7月28日
0.45, # 7月29日
0.5, # 7月30日
0.55, # 7月31日
0.6, # 8月1日
0.7, # 8月2日
0.8, # 8月3日
0.9, # 8月4日峰值
0.8, # 8月5日
0.7, # 8月6日
0.6, # 8月7日
0.5, # 8月8日
0.4, # 8月9日
0.35, # 8月10日
0.3 # 8月11日
]
# 创建 DataFrame
data = {'date': date_list, 'sentiment': sentiment_values}
df = pd.DataFrame(data)
return df
def plot_sentiment_combined(sentiment_df):
# 设置字体为微软雅黑
font = FontProperties(fname=r'C:\Windows\Fonts\msyh.ttc', size=12)
# 设置图形大小
plt.figure(figsize=(12, 6))
# 绘制柱状图
plt.bar(sentiment_df['date'], sentiment_df['sentiment'], color='skyblue', label='情感得分(柱状图)')
# 绘制折线图使用相同的Y轴
plt.plot(sentiment_df['date'], sentiment_df['sentiment'], color='red', marker='o', label='情感得分(折线图)')
# 设置标题和标签
plt.title('情感得分随时间的变化', fontproperties=font)
plt.xlabel('日期', fontproperties=font)
plt.ylabel('情感得分', fontproperties=font)
# 设置日期格式和字体
plt.xticks(sentiment_df['date'], sentiment_df['date'].dt.strftime('%m-%d'), rotation=45, fontproperties=font)
plt.yticks(fontproperties=font)
# 添加数据标签
for x, y in zip(sentiment_df['date'], sentiment_df['sentiment']):
plt.text(x, y + 0.02, f'{y:.2f}', ha='center', fontproperties=font)
# 添加网格线
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 显示图例
plt.legend(prop=font)
# 调整布局以防止标签重叠
plt.tight_layout()
# 显示图形
plt.show()
# 使用示例
sentiment_df = create_manual_data()
plot_sentiment_combined(sentiment_df)