ggplot根据x值的点数

时间:2018-01-13 18:02:39

标签: r ggplot2

我有一个来自Hadley Wickham的ggplot2书中的问题。 我在这里有这个数据框:

class <- mpg %>%
   group_by(class) %>% 
   summarise(n = n(), hwy = mean(hwy))

我想绘制一个如下图: enter image description here

我试过了:

class %>% ggplot(aes(n, hwy)) +
          geom_count()

这并没有给我上面的图表。 有没有人有任何有用的建议?

2 个答案:

答案 0 :(得分:4)

试试这个,看看下面@JakeKaupp的评论。

library(tidyverse)
class <- mpg %>%
count(class) %>% 
mutate(label = paste0("n = ", n))

ggplot(data = mpg, aes(class, hwy)) +
 geom_jitter(width = 0.1) +
 stat_summary(geom = "point", fun.y = mean, colour = "red", size = 5) +
 geom_text(data = class, aes(y = 10, label = label))

enter image description here

答案 1 :(得分:1)

我正在做相同的练习,并使用同一本书。这是我的代码,但与第一个答案几乎相同,但我将尝试解释原因。

ggplot(mpg, aes(class, hwy)) +
 geom_jitter(width = 0.05, size = 2) +
 geom_point(aes(y = hwy), data = class, size = 4, color = "red") +
 geom_text(aes(y = 10, label = paste0("n = ", n)), data = class)

结果是: enter image description here

首先,您使用ggplot()函数定义要使用的主要数据集和外观。在这里,我们要绘制相对于类(x轴)的hwy(y轴)作为点。这是第一行代码。

第二,请记住,ggplot2的工作原理是逐层绘制图形。第二行代码是我们要添加的第一层。而不是使用geom_point()的散点图,我们希望使用抖动图来避免对geom_point()进行过度绘图。在这里,我们使用与ggplot()中所示的数据集相同的数据集-mpg,并使用相同的美观度(x = class,y = hwy),因此我们不会进行任何更改。但是,要使其看起来像教科书中的原始图,我们希望将width压缩为0.05(或者您可以将此数字调整为0.1、0.2以进行查看),并且可以添加size = 2或1或3,没关系。

第三,我们想在原始图形中创建相同的红点。这个红点是第三层。在这里我使用geom_point()是因为这些红色的点基本上是点。但是,红点表示相应x值上y值的平均值。在原始数据集mpg中,我们没有此变量。因此,在第二层红点中,我们需要重置一些美观和数据。我们希望美学具有y = hwy,这与ggplot()相同,但是我们更改了数据集,所以data = class。现在,该层知道每个类都匹配1个y轴值,该值是hwy的平均值。我们在那里有红点,但我们也想调整大小以使其看起来很大,然后颜色变为红色。

最后,添加标签层。任何注释,我们都使用geom_text()层来完成。我们设置aes(y = 10),因为这将在y = 10位置附近设置标签的高度。然后,我们要设置标签值。但是在这里,我们只知道n,即计数。但是在原始图中,它是n =整数。因此,我们需要使用paste0()函数来连接字符串和数字。写入,label = paste0(“ n =”,n)的作用为n =整数,然后,我们将数据设置为class,因为我们没有使用原始的mpg。

然后绘制完成。您还可以添加标题或x,y轴标签等。但是我的方法是编写一层,然后运行代码以检查外观,然后编写另一层。它可以帮助您考虑整个图形。希望能帮助到你。