Дублированные метки xtick в фасетах ggplot

У меня есть этот data.frame, который я хочу построить в гранях, используя ggplot + facet_wrap:

set.seed(1)
df <- data.frame(val=rnorm(36),
                 gt=c(sapply(c("wt","pd","md","bd"),function(x) rep(x,9))),
                 ts=rep(c(sapply(c("cb","hp","ac"),function(x) rep(x,3))),4),
                 col=c(sapply(c("darkgray","darkblue","darkred","darkmagenta"),function(x) rep(x,9))),
                 index=rep(1:9,4),
                 stringsAsFactors=F)
df$xlab <- paste(df$ts,df$index,sep=".")
df$gt <- factor(df$gt,levels=c("wt","pd","md","bd"))

Вот как я пытаюсь построить:

require(ggplot2)
ggplot(df,aes(x=index,y=val,color=gt))+geom_point(size=3)+facet_wrap(~gt,ncol=4)+
  scale_fill_manual(values=c("darkgray","darkblue","darkred","darkmagenta"),labels=levels(df$gt),name="gt",guide=F)+
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta"),labels=levels(df$gt),name="gt",guide=F)+
  labs(x="replicate",y="val")+scale_x_continuous(breaks=df$index,labels=df$xlab)+
  theme_bw()+theme(axis.text=element_text(size=6),axis.title=element_text(size=7),legend.text=element_text(size=6),legend.key=element_blank(),panel.border=element_blank(),strip.background=element_blank())

Который дает:

введите здесь описание изображения

Проблема в том, что метки галочки оси x0 повторяются, так как я звоню scale_x_continuous. Как мне сделать это правильно с facet_wrap?


person dan    schedule 21.11.2016    source источник


Ответы (1)


Используйте фактические значения x в xlab в качестве эстетики x вместе с scales="free_x" в facet_wrap и удалите вызов scale_x_continuous. Обратите внимание, однако, что метки осей остаются одинаковыми на каждой панели, потому что они одинаковы для каждого уровня gt в данных.

ggplot(df,aes(x=xlab, y=val, color=gt)) + 
  geom_point(size=3, show.legend=FALSE) + 
  facet_wrap(~gt, ncol=4, scales="free_x") +
  # scale_fill_manual(values=c("darkgray","darkblue","darkred","darkmagenta"), labels=levels(df$gt), name="gt", guide=F) +
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta")) +
  labs(x="replicate", y="val") + 
  #scale_x_continuous(breaks=df$index, labels=df$xlab)+
  theme_bw() + 
  theme(axis.text=element_text(size=8),
        axis.title=element_text(size=7),
        legend.text=element_text(size=6),
        legend.key=element_blank(),
        panel.border=element_blank(),
        strip.background=element_blank())

введите здесь описание изображения

Теперь давайте изменим xlab, просто чтобы посмотреть, как это работает, когда разные панели действительно имеют разные метки:

df$xlab[10:20] = LETTERS[1:11]

Теперь снова запустите тот же код графика, чтобы получить следующее:

введите здесь описание изображения

Еще одним непредвиденным обстоятельством является случай, когда не все панели имеют одинаковое количество значений x. В этом случае вы можете переключиться на facet_grid и добавить space="free_x", если вы хотите, чтобы ширина каждой панели была пропорциональна количеству x-значений в каждой панели.

ggplot(df[-c(1:5),], aes(x=xlab, y=val, color=gt)) + 
  geom_point(size=3, show.legend=FALSE) + 
  facet_grid(.~gt, space="free_x", scales="free_x") +
  scale_colour_manual(values=c("darkgray","darkblue","darkred","darkmagenta")) +
  labs(x="replicate", y="val") + 
  theme_bw() + 
  theme(axis.text=element_text(size=8),
        axis.title=element_text(size=7),
        legend.text=element_text(size=6),
        legend.key=element_blank(),
        panel.border=element_blank(),
        strip.background=element_blank())

введите здесь описание изображения

Несколько других вещей:

  • Вам не нужно добавлять названия цветов во фрейм данных. Если вы хотите изменить цвет по умолчанию, вы можете просто установить их с помощью одной из функций scale_colour_*** (как вы сделали в своем коде).

  • Для дальнейшего использования этот c(sapply(c("darkgray","darkblue","darkred","darkmagenta"),function(x) rep(x,9))) можно изменить на этот rep(c("darkgray","darkblue","darkred","darkmagenta"), each=9).

  • Вы можете удалить линию scale_fill_manual, так как на вашем графике нет эстетики fill.

person eipi10    schedule 21.11.2016