【问题标题】:Showing correct label in ggplot using a different variable [duplicate]使用不同的变量在ggplot中显示正确的标签[重复]
【发布时间】:2018-03-30 16:05:47
【问题描述】:

我有一个包含 4 个变量的数据,如下所示:

id|name|year|value|
1   A    16   500
1   A    15   400
1   A    14   430
2   B    16   200
2   B    15   180
2   B    14   170
3   A    16   620
3   A    15   510
3   A    14   200

然后,我必须在 ggplot 中为每个 id 创建一个时间折线图,但显示它的标签而不是它的 id。我所做的是:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$id)

但它显示图表写的是他们的 ID 而不是他们的名字,所以我尝试了:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$name)

它创建了带有正确标签的折线图,但是 id 1 和 id 3 具有相同的名称,因此,最后,它只创建了 2 个图表而不是 3 个图表,其中一个有 6 个观察值而不是 3 个.

有没有办法将名称与 id 连接起来?然后通过 id 连接更正名称。

【问题讨论】:

  • 如果您提供complete minimal reproducible example 来回答您的问题,我们更有可能为您提供帮助。我们可以从中工作并用来向您展示如何回答您的问题。
  • 好吧,我刚才展示的内容是最小的、完整的和可验证的。
  • 参见?labeller 中的示例:“# 或者使用字符向量作为查找表:”。例如。 lab <- c("1" = "A", "2" = "B", "3" = "A"); facet_wrap(~id, labeller = labeller(id = lab))

标签: r ggplot2 concatenation facet-wrap


【解决方案1】:

更新:

创建一个名为 name2 的组合 nameid 列,id 在新行上,然后绘制图表。

db$name2 <- paste(db$name,db$id,sep="\n") 

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~name2)

你可以这样做:

ggplot(db, aes(x=year, y= value)) + 
  geom_line() + 
  facet_wrap(~interaction(id, name))

这会为名称和 ID 的每个组合创建一个单独的图表。如果您想排除1.2.,我们将不得不调整解决方案。

数据:

db <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), name = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"), 
    year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L), value = c(500L, 
    400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)), .Names = c("id", 
"name", "year", "value"), class = "data.frame", row.names = c(NA, 
-9L))

【讨论】:

  • 效果很好!但是最好放弃 .1 和 .2。
  • 或者如果我们在两行中制作标签,因为我实际上没有那些 ID 和名称,但在某些情况下 ID 和名称要大得多。因此,如果我们将 name 放在第一行,skip 然后将 id 放在第二行,将是完美的场景。
  • @gustavomoty 查看我的更新!
  • @gustavomoty 同样,如果您真的想完全排除 id,Henrik 在 cmets 中的解决方案也有效
  • 谢谢,如我所愿! @mako212
【解决方案2】:

Marko212's answer 肯定更好。但是,如果您需要在将来某个时候将 nameid 连接起来。

dta <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L),
         name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), 
         .Label = c("A", "B"), class = "factor"), 
         year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L),
         value = c(500L, 400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)),
         .Names = c("id", "name", "year", "value"), 
         class = "data.frame", row.names = c(NA,  -9L))

dta$name_id <- with(dta, paste0(id, name))
dta
#>   id name year value name_id
#> 1  1    A   16   500      1A
#> 2  1    A   15   400      1A
#> 3  1    A   14   430      1A
#> 4  2    B   16   200      2B
#> 5  2    B   15   180      2B
#> 6  2    B   14   170      2B
#> 7  3    A   16   620      3A
#> 8  3    A   15   510      3A
#> 9  3    A   14   200      3A

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2018-05-31
    相关资源
    最近更新 更多