基于R-ggplot2的均值时间序列分析及可视化问题求助
解决代码报错与情感可视化方案
一、修复时间序列均值计算的代码报错
你遇到的match.names错误,大概率是因为使用reshape2::melt()时没有明确指定需要保留的分组列(也就是时间分段列),导致函数尝试处理不匹配的列名。更适配tidyverse工作流的方式是用tidyr::pivot_longer()来重塑数据,同时把你需要的6个月分段修正过来(你代码里写的是2个月哦)。
修正后的代码如下:
library(tidyverse) library(lubridate) # 处理日期时间的必备包 # 按6个月分段计算正负情感均值,并重塑为长格式 posnegtime <- kdn_tweets %>% group_by(created_at = cut(created_at, breaks = "6 months")) %>% summarise(negative = mean(negative), positive = mean(positive)) %>% pivot_longer(cols = c(negative, positive), names_to = "sentiment_type", values_to = "mean_value")
为什么这样能解决问题?pivot_longer()可以明确指定哪些列是要转换为分类的(这里是negative和positive),哪些列是保留的分组标识(created_at),避免了melt()默认处理时的列名匹配混乱。
二、绘制时间序列情感均值图
基于上面整理好的数据,用ggplot绘制时间序列图:
ggplot(posnegtime, aes(x = created_at, y = mean_value, color = sentiment_type, group = sentiment_type)) + geom_line(linewidth = 1) + geom_point(size = 2) + labs(title = "Mean Sentiment Over 6-Month Intervals", x = "Time Interval", y = "Mean Sentiment Score", color = "Sentiment Type") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
三、绘制一周各天/一年各月的情感分布
针对你想要的周/月情感分布图表,我们可以用lubridate提取日期中的星期和月份信息,再分组计算均值后可视化:
1. 一周各天的情感分布
# 提取星期几,计算各天的情感均值 weekday_sentiment <- kdn_tweets %>% mutate(weekday = wday(created_at, label = TRUE, abbr = FALSE)) %>% # 提取完整星期名 group_by(weekday) %>% summarise(negative = mean(negative), positive = mean(positive)) %>% pivot_longer(cols = c(negative, positive), names_to = "sentiment_type", values_to = "mean_value") # 绘制柱状图(类似你给出的示例风格) ggplot(weekday_sentiment, aes(x = weekday, y = mean_value, fill = sentiment_type)) + geom_col(position = "dodge") + labs(title = "Mean Sentiment by Day of Week", x = "Day of Week", y = "Mean Sentiment Score", fill = "Sentiment Type") + theme_minimal()
2. 一年各月的情感分布
# 提取月份,计算各月的情感均值 month_sentiment <- kdn_tweets %>% mutate(month = month(created_at, label = TRUE, abbr = FALSE)) %>% # 提取完整月份名 group_by(month) %>% summarise(negative = mean(negative), positive = mean(positive)) %>% pivot_longer(cols = c(negative, positive), names_to = "sentiment_type", values_to = "mean_value") # 绘制柱状图 ggplot(month_sentiment, aes(x = month, y = mean_value, fill = sentiment_type)) + geom_col(position = "dodge") + labs(title = "Mean Sentiment by Month of Year", x = "Month", y = "Mean Sentiment Score", fill = "Sentiment Type") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
如果想要更贴近你给出的示例图(比如折线+点的组合),可以把geom_col()换成geom_line()+geom_point(),根据你的需求调整即可。
内容的提问来源于stack exchange,提问作者user709413
相关产品推荐
相关产品推荐

