ggplot 如何在 R 中垂直而不是水平地 "read" 数据

ggplot how to "read" data vertically instead of horizontally in R

数据框目前看起来像这样:

编辑:结构

library(data.table)
library(dplyr)
library(tibble)

但我收到以下错误:“每组仅包含一个观察结果”。

如果是这样,我怎样才能得到一个按月绘制每列值的折线图?

此外,我不确定如何在 ggplot aes() 位中 select 多个区域。我尝试使用 c() 无济于事。任何帮助和新手友好的建议将不胜感激!

您的问题分为几个部分:

  1. 要立即解决您的错误,您需要向 geom_line() 函数添加一个 group = 1 参数

    1a。这是因为 geom line 允许您绘制多条 'groups' 线,这些线彼此断开连接。在这个初始情况下,所有的点都在同一组中,你想用线连接它们。

  2. 要绘制多个组,您首先要以长格式定位数据,这将使您更轻松地使用 ggplot。为此,您需要包含如下一行:

     tidyr::pivot_longer(data, -Date, values_to = "value_on_date", names_to = "region")
    

这将生成长格式的数据

然后您可以将代码更改为

df %>% 
        tidyr::pivot_longer(-Date, values_to = "value_on_date", names_to = "region") %>% 
ggplot( aes(Date, value_on_date)) +
        geom_line(aes(group = region)) +
        labs(x="Date", y="Value on date")

然后将显示 3 行,每个区域一行。

2a。该代码中值得注意的事情,请注意在 geom_line 中,该组现在位于 aes() 调用中,这是因为该组现在将随着数据而变化,而不是一个常量,这是一个通用结构所有 ggplot.

2b。 ggplot 中的另一个原则是每一行应该是 1 个观察值,以及所有相关的细节。使用您显示的数据,每一行实际上是 3 位数据,每个区域一个,这不适用于 ggplot。

2c。然后,您可以通过将 color = region 之类的内容添加到 aes() 参数中来扩展它,以更清楚地显示哪个区域

希望这会有所帮助,正如 stefan 所说,包括一些关于如何进入会话状态的最小可重现示例可以帮助任何想要回答您问题的人。

添加群组美学将修复此错误。

在 ggplot 调用中将 group = 1 添加到您的 aes。

问题是您的 x 轴变量是字符变量或分类变量。在这种情况下,ggplot 默认使用此变量对数据进行分组,即每组只有一个观察值。在这种情况下,您必须告诉 ggplot 所需的分组,这可以通过 group=1 完成,这意味着 ggplot2 应该将所有观察值视为属于一个组,为简单起见,我们称之为 1.

要获得所有区域的线图,最好将数据重塑为长格式,例如使用tidy::pivot_longer 这给了我们两个新的列,一个是类别或区域的名称,另一个是相应的值。重塑后,您可以使用 group=name.

映射 y 上的值并按区域分组
library(dplyr)
library(tidyr)
library(ggplot2)

df <- structure(list(Date = c("01-2019", "02-2019", "03-2019"), `North East` = c(
  5.05625777763551,
  5.58119346747183, 5.41295614949722
), London = c(
  4.2102766429572,
  4.45850956493638, 4.36960549219723
), `West Midlands` = c(
  5.0708122696351,
  5.20425572086481, 5.07463979478007
)), row.names = c(NA, 3L), class = "data.frame")

df_long <- df %>%
  pivot_longer(-Date)

ggplot(df_long, aes(Date, value, color = name, group = name)) +
  geom_line() +
  labs(x = "Date", y = "Region")