如何使用ggplot制作小提琴图,而y变量没有列?

时间:2019-07-16 14:26:35

标签: r ggplot2

我的数据框只有要创建为小提琴图的列,但未指定y值。

每个列是一个不同的数据子集,显示平均演化速率(因此,实际上应自动创建y列)。几乎所有使用ggplot的示例都使用car数据集,您可以在其中指定数据框中已存在的x列和y列。

我的数据框示例:

Species  Zone1   Zone2   Zone3   Zone4
cf       0.0045  0.040   0.054    0.089
cx       0.12    0.145   0.098    0.095
cy       0.044   0.067   0.051    0.077

我想制作小提琴图,其中x轴具有Zone1,Zone2,Zone3和Zone4,而y轴只是进化速率值。

我可以使用vioplot软件包来执行此操作,但是我想保留脚本使用tidyverse和ggplot,因为我喜欢它的更多功能。但是我无法弄清楚如何转换数据以显示所需的数据。

我尝试过:

ggplot(my_data, aes(x=c(Zone1, Zone2, Zone3, Zone4), 
        y=c(Zone1, Zone2, Zone3, Zone4)) + geom_violin()

但这有太多参数...不确定y变量该怎么做。

1 个答案:

答案 0 :(得分:2)

您可以将数据从宽格式(tidyr::gather())转换为与ggplot2一起使用

library(tidyverse)

df <- read.table(text = "Species  Zone1   Zone2   Zone3   Zone4
cf       0.0045  0.040   0.054    0.089
cx       0.12    0.145   0.098    0.095
cy       0.044   0.067   0.051    0.077",
                 header = TRUE, stringsAsFactors = FALSE)

df_long <- df %>% 
  gather(key = "Zone", value = "Rate", -Species)
df_long
#>    Species  Zone   Rate
#> 1       cf Zone1 0.0045
#> 2       cx Zone1 0.1200
#> 3       cy Zone1 0.0440
#> 4       cf Zone2 0.0400
#> 5       cx Zone2 0.1450
#> 6       cy Zone2 0.0670
#> 7       cf Zone3 0.0540
#> 8       cx Zone3 0.0980
#> 9       cy Zone3 0.0510
#> 10      cf Zone4 0.0890
#> 11      cx Zone4 0.0950
#> 12      cy Zone4 0.0770

ggplot(df_long, aes(x = Zone, y = Rate)) +
  geom_violin(trim = FALSE) 

ggplot(df_long, aes(x = Zone, y = Rate)) +
  geom_violin(trim = TRUE) 

reprex package(v0.3.0)于2019-07-16创建