【问题标题】:Strings in ggplot x-axisggplot x轴中的字符串
【发布时间】:2017-09-16 23:21:13
【问题描述】:

我正在尝试像这样在 R 中创建一个图形:

我有三列(在线、离线和路线)。但是,当我添加以下代码时:

library(ggplot2)
ggplot(coefroute, aes(routes,offline)) + geom_line()

我收到以下消息:

geom_path:每个组仅包含一个观察值。需要调整群体审美吗?

coefroute 样本:

routes  online  offline
(Intercept) 210.4372    257.215
route10 7.543   30.0182
route100    18.3794 1.5313
route11 38.6537 78.8655
route12 66.501  94.8838
route13 -22.2391    -25.8448
route14 24.3652 177.7728
route15 48.5464 51.126 ...

路由:char,在线和离线:num

谁能帮我把字符串放在 R 的 x 轴上? 谢谢!

【问题讨论】:

  • 看看你的数据集的例子会很有用——你能分享吗?否则只是赌一把,我建议在aes 中添加group=1
  • 当然。该表有三列。一个命名为路线(您在图表中看到的 x 轴中的值,另一个命名为 online,使用在线时的路线值,第三个命名为离线,使用离线时的路线值。
  • 谢谢卡里普斯,但你能用详细信息/数据编辑你的问题吗,因为它可以更容易地看到发生了什么(ps,如果你添加dput(droplevels(head(coefroute)))的结果,我们可以看到这个类对于变量 - 您可以通过更改 n 参数来更改要在 head 中返回的行数,以确保添加了足够的行来代表您的问题)

标签: r plot ggplot2


【解决方案1】:

在没有样本数据的情况下,这里有一些与你的结构相同的玩具数据:

coefroute <- data.frame(routes = c("A","B","C","D","E"),
                    online = c(21,26,30,15,20),
                    offline = c(15,20,7,12,15))

要在ggplot2 中复制您的示例图,您需要较长格式的数据,以便您可以离线/在线分组。在此处查看更多信息:Plotting multiple lines from a data frame with ggplot2http://ggplot2.tidyverse.org/reference/aes.html

您可以使用许多不同的函数或包非常轻松地将数据重新排列为长格式,但标准方法是使用来自tidyrgather 并将您的系列为onlineoffline 分组为一些东西打电话,比如说,status 或任何你想要的。

library(tidyr)
coefroute <- gather(coefroute, key = status, value = coef, online:offline)

然后你可以在 ggplot 中轻松绘制:

library(ggplot2)
ggplot(coefroute, aes(x = routes, y = coef, group = status, colour = status))
 + geom_line() + scale_x_discrete()

这应该会创建类似于您的示例图的内容。您可能想要修改颜色、标题等。有很多关于这些内容的文档很容易找到。我在这里添加了scale_x_discrete(),以便 ggplot 知道将您的 x 变量视为离散变量。

其次,我怀疑线图在传达您在这里试图传达的内容方面可能不如几何图形有效。我可能会使用geom_bar(stat = "identity", position = "dodge") 代替geom_line。这将为每个系数创建一个垂直条形图,并排离线和在线系数。

ggplot(coefroute, aes(x = routes, y = coef, group = status, fill = status)) 
+ geom_bar(stat = "identity", position = "dodge") + scale_x_discrete()

【讨论】:

    【解决方案2】:

    有两种方法:

    • 以宽格式绘制数据(又快又脏,不推荐)
    • 绘制从宽格式到长格式重塑后的数据(如dshkol 所示,但使用不同的方法。

    以宽格式绘制数据

    # using dshkol's toy data
    coefroute <- data.frame(routes = c("A","B","C","D","E"),
                            online = c(21,26,30,15,20),
                            offline = c(15,20,7,12,15))
    library(ggplot2)
    # plotting data in wide format (not recommended)
    ggplot(coefroute, aes(x = routes, group = 1L)) + 
      geom_line(aes(y = online), colour = "blue") +
      geom_line(aes(y = offline), colour = "orange")
    

    这种方法有几个缺点。每个变量都需要自己调用geom_line(),并且没有图例。

    绘制重塑数据

    对于整形,使用了melt(),它可从reshape2 包(tidyr/dplyr 包的前身)或data.table 包的更快实现中获得。

    ggplot(data.table::melt(coefroute, id.var = "routes"), 
           aes(x = routes, y = value, group = variable, colour = variable)) + 
      geom_line()
    

    请注意,在这两种情况下都必须指定 group 美学,因为 x 轴是离散的。这告诉 ggplot 考虑属于一个系列的数据点,尽管 x 值是离散的。

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多