r - 制作 ggplot2 将密度直方图绘制为线条

标签 r ggplot2

我有一个关于我在 3 个网站(比如 OpenTable、Yelp、TripAdvisor)上收集的评分的简单表格。评级从 1 到 5,因此评级是一个因素列,网站是另一个因素列(仅允许 3 个值)。我只有这样的两列和我所有的观察结果。该结构是一个名为 all 的数据框,包含上述列。示例:

Website           Rating
_________________________
Yelp                 1
TripAdvisor          2
Yelp                 3
OpenTable            2

我想做的是绘制彩色密度图。

我的问题看起来与此线程中发布的问题完全相同:Create a density plot with ggplot2 using a factor

但是,该解决方案对我不起作用。我尝试通过使用

替换我的变量名称

ggplot(全部,aes(评级,颜色=网站,组=网站)) + geom_密度()

但是它不起作用。我没有给我插值曲线,而是得到:My density plot

在我看来,我与链接线程中的OP具有相同的数据结构:一个数据框(all),带有两个因子列(website评级)。

> mode(all)
[1] "list"
> head(all$website)
[1] TripAdvisor TripAdvisor TripAdvisor TripAdvisor TripAdvisor TripAdvisor
Levels: TripAdvisor OpenTable Yelp
> head(all$rating)
[1] 1 2 1 4 5 2
Levels: 1 2 3 4 5

我的问题是:为什么我的行为不同?我该怎么做才能获得相同的情节?作为奖励/不同的解决方案,我还会尝试用直线插值我的点,而不是使用更复杂的内核,但我需要保持密度,因为我对一个网站的观察结果比其他两个网站的观察结果加起来要多得多。

数据样本:

> dput(all[sample(nrow(all), 200),])
structure(list(website = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 
3L, 3L, 1L, 3L, 2L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 1L, 3L, 1L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 
2L, 3L, 3L, 3L, 1L, 3L, 1L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 1L, 3L, 
3L, 3L, 3L, 3L, 2L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 1L, 3L, 
1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 
3L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 2L, 1L, 3L, 3L, 3L, 
1L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L, 
3L, 3L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L, 1L, 2L, 3L, 1L, 3L, 3L, 
3L, 3L), .Label = c("TripAdvisor", "OpenTable", "Yelp"), class = "factor"), 
    rating = c(2, 4, 5, 3, 5, 3, 2, 4, 4, 5, 5, 2, 5, 5, 4, 2, 
    5, 4, 5, 5, 4, 4, 3, 5, 3, 2, 4, 4, 4, 2, 4, 5, 3, 4, 5, 
    4, 4, 3, 5, 4, 5, 2, 5, 5, 4, 3, 1, 5, 5, 5, 5, 2, 4, 1, 
    1, 4, 4, 4, 3, 1, 5, 4, 4, 5, 4, 4, 5, 4, 1, 1, 3, 4, 5, 
    5, 5, 4, 5, 2, 3, 4, 2, 4, 4, 4, 3, 2, 4, 4, 4, 4, 5, 4, 
    5, 3, 1, 5, 2, 3, 5, 1, 5, 4, 4, 5, 5, 4, 4, 4, 4, 5, 4, 
    4, 4, 3, 3, 5, 2, 4, 3, 5, 3, 3, 3, 5, 4, 1, 3, 3, 5, 4, 
    4, 2, 2, 4, 3, 2, 5, 5, 5, 4, 5, 1, 2, 5, 2, 4, 2, 5, 3, 
    4, 4, 3, 4, 5, 3, 3, 5, 4, 2, 4, 5, 4, 1, 4, 5, 1, 5, 1, 
    2, 5, 3, 3, 4, 5, 4, 4, 3, 3, 4, 4, 3, 3, 4, 3, 4, 3, 4, 
    5, 3, 2, 5, 3, 4, 4, 1, 5, 4, 3, 5, 3)), .Names = c("website", 
"rating"), row.names = c(2736944L, 3701156L, 4217688L, 5350640L, 
3600261L, 2944052L, 3522393L, 5443298L, 3965562L, 490821L, 4706825L, 
1694078L, 3395609L, 2220568L, 2886121L, 4329867L, 3414341L, 4911507L, 
2629607L, 2547491L, 5254750L, 5089579L, 922864L, 643065L, 1797579L, 
782480L, 686194L, 5035633L, 998745L, 553929L, 888404L, 730158L, 
4357257L, 1824206L, 4941425L, 2910113L, 2006209L, 643302L, 1534660L, 
3489947L, 202175L, 2483374L, 820339L, 3411547L, 4792406L, 1379214L, 
3900503L, 1000939L, 3823518L, 5340233L, 1330743L, 5333146L, 3638755L, 
2445636L, 1057389L, 5092709L, 5092040L, 3841598L, 3739264L, 1482807L, 
1314908L, 2522682L, 1757427L, 723017L, 4809829L, 4636027L, 1728575L, 
2974897L, 3485658L, 2592565L, 3207974L, 2721825L, 4295506L, 4953206L, 
3325724L, 4706765L, 455090L, 5386094L, 612504L, 3483673L, 881132L, 
1715784L, 4478951L, 1995026L, 1640553L, 4213693L, 925338L, 4541407L, 
3602299L, 5233082L, 727017L, 4954392L, 270757L, 3436121L, 3793314L, 
824985L, 1558576L, 3659425L, 2131835L, 1721671L, 32696L, 3405602L, 
2736827L, 4403647L, 2171731L, 2954043L, 976434L, 3680791L, 30799L, 
4833704L, 3895171L, 4469617L, 2517017L, 4236947L, 733711L, 1480361L, 
255671L, 4847331L, 355851L, 2933805L, 5470569L, 3045714L, 3423394L, 
475428L, 4460007L, 4668961L, 1560070L, 3314368L, 2150067L, 4480758L, 
781676L, 3659111L, 4799721L, 3509779L, 5320687L, 5179115L, 852931L, 
4141898L, 4768793L, 1356381L, 3881247L, 1685112L, 2232222L, 315374L, 
1721551L, 1464571L, 2472040L, 3198238L, 4719488L, 2763751L, 2999152L, 
2042160L, 1374928L, 1703496L, 1805583L, 5192311L, 3558389L, 925026L, 
5497787L, 2464617L, 1850617L, 1047932L, 186007L, 3168546L, 1433736L, 
1548105L, 5450L, 5288180L, 2476807L, 997242L, 4693332L, 5107109L, 
3338800L, 2722363L, 58422L, 3408902L, 4537803L, 2780976L, 2129998L, 
376274L, 1773109L, 5138810L, 2364642L, 1087043L, 3318862L, 1567254L, 
418564L, 726387L, 4128160L, 4669905L, 1194602L, 2315020L, 211234L, 
818018L, 3378122L, 462827L, 1516313L, 3120210L, 4257323L, 5214034L
), class = "data.frame")

最佳答案

正如 @joran 在他的评论中指出的那样,这一切似乎都是带宽问题。如果我用低带宽绘制示例数据,它看起来就像您提供的图像:

ggplot(all, aes(rating, colour=website, group=website)) + geom_density(adjust=0.1)

enter image description here

但是对于高带宽,情况似乎完全不同:

ggplot(all, aes(rating, colour=website, group=website)) + geom_density(adjust=2)

enter image description here

如果您只想绘制与线连接的相对频率,我认为您必须事先计算它们。例如:

all.prop <- data.frame(prop.table(table(website=all$website, rating=all$rating),1))
ggplot(all.prop, aes(x=rating, y=Freq)) + geom_line(aes(group=website, color=website))

enter image description here

关于r - 制作 ggplot2 将密度直方图绘制为线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14825187/

相关文章:

read_excel 在消息中读取 - 抑制?

r - 是否可以在不重新创建或修改几何图层的情况下添加 ggplot 美学?

r - 基于另一个数据框的两行比较

r - 使用 ggplotly 对图例中的元素进行分组失败

r - 在图例下方添加其他文本(R + ggplot)

r - 在 R 中的数据帧中将负值转换为零

r - 整理包描述中的字段

r - ggpubr 找不到 'mean_se' 除非 ggpubr 是通过 library() 附加的

r - ggplot2 中的绘图树

r - 我不知所措 - ggplot2::ggsave 不会导出自定义字体