如何使用ggplot2两次绘制重复变量(而不是将其强制转换为因子)?

时间:2018-04-04 19:09:00

标签: r ggplot2

我有一个数据框:

df <- data.frame(Name=c('abc', 'bcd', 'cde', 'bcd', 'abc', 'def'), Pos=c(1, 2, 3, 2, 4, 5))

Name  Pos
abc   1
bcd   2
cde   3
bcd   2
abc   4
def   5

我想按照位置的顺序绘制名称,但我想要显示每一行,即使它是重复的值:

ggplot(df, aes(Pos, reorder(Name, -Pos))) +
    geom_jitter(width=0, height=0.05)

enter image description here

我可以看到'bcd'在Pos 2处有两个点,而'abc'在Pos 1和4处有一个点。但我希望这些点位于y轴上的不同刻度上。如果我将df $ Name更改为一个字符而不是一个因子(df $ Name&lt; - as.character(df $ Name)),这没有帮助。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

也许这样......?

library(dplyr)

df <- df %>% 
  group_by(Name,Pos) %>% 
  mutate(Name1 = paste0(Name,row_number()))
labs <- with(df,setNames(as.character(Name),Name1))

ggplot(df, aes(Pos, reorder(Name1, -Pos))) +
  geom_jitter(width=0, height=0.05) + 
  scale_y_discrete(labels = labs)

enter image description here

答案 1 :(得分:1)

这会将行号添加到data.frame中,并使用这些行绘制,但会将Names指定为标签。这是你的想法吗?

library(tidyverse)
df <- data.frame(Name=c('abc', 'bcd', 'cde', 'bcd', 'abc', 'def'), Pos=c(1, 2, 3, 2, 4, 5)) %>% 
  mutate(n = 1:n())

ggplot(df, aes(Pos, n)) +
  geom_point() +
  scale_y_continuous(breaks = df$n, labels = df$Name)