ggplot x轴中的字符串

时间:2017-09-16 23:21:13

标签: r plot ggplot2

我试图在R中创建一个图形,如下所示: enter image description here

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

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 ...

routes:char,online and offline:num

任何人都可以帮我把字符串放在R轴的x轴上吗? 谢谢!

2 个答案:

答案 0 :(得分: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

您可以使用许多不同的功能或包很容易地将数据重新排列为长格式,但标准方法是使用gather中的tidyr并将您的系列分组为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变量视为离散变量。

其次,我的怀疑是,在传达你在这里尝试沟通的内容时,线条图可能不如geoms有效。我可能会使用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()

答案 1 :(得分:1)

有两种方法:

  • 以宽幅格式绘制数据(快速和肮脏,不推荐)
  • 在从宽格式转换为长格式后绘制数据(如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")

enter image description here

这种方法有几个缺点。每个变量都需要自己调用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()

enter image description here

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