ggplot:对数据框或轴进行排序,以使字符位于数字之前

问题描述

我已经按照此示例构造了数据,并希望从中创建一个热图。我在构造y轴时遇到问题,因此字符“ A”在顶部,而其下的数字则按升序排列。

对于给出的示例,我希望有A,1、2和A,3、4。使用fct_relevelfct_rev,我找到了正确使用“ A”的方法位置或轴按我想要的顺序排列,但是如果不弄乱我的方面,我无法找到两种解决方案。

感谢您的帮助!

current Plot

示例数据:

frws <- rep(c('AtTop','Bottom'),each=12)
fcols <- rep(c('left','right','left','right'),each=6)
xlabs <- rep(c('a','b'),times=12)
mdat <- data.frame(frws,fcols,xlabs,ID)
mdat$ID <- rep (c('A','1','2','A','3','4','4'),each=2)
mdat$numbers <- c(1,1,2,3,3)

这里没有成功:

mdat <- within(mdat,ID <- ordered(ID,levels = (unique(ID))))
mdat <- mdat %>% 
  mutate(ID = fct_relevel(ID,"A"))

我想使用有序y轴绘制的图:

mdat %>% 
  ggplot(aes(xlabs,ID)) + 
  geom_tile(aes(fill = numbers),colour = "white") +
  facet_rep_grid(frws ~ fcols,scale="free")+
  scale_fill_gradientn( colors = c("white","green","red"),values = rescale (c(0,1.0,2.5)))

解决方法

您可以尝试以下方法:

图书馆(tidyverse)

#Data
frws <- rep(c('AtTop','Bottom'),each=12)
fcols <- rep(c('left','right','left','right'),each=6)
xlabs <- rep(c('a','b'),times=12)
mdat <- data.frame(frws,fcols,xlabs)
mdat$ID <- rep (c('A','1','2','A','3','4','4'),each=2)
mdat$numbers <- c(1,1,2,3,3)

#Format levels
valev <- unique(mdat$ID)
va1 <- valev[valev=='A']
valev <- valev[valev!='A']
valev <- sort(valev,decreasing = T)
levs <- c(valev,va1)
mdat$ID <- factor(mdat$ID,levels = levs)

#Plot

mdat %>% 
  ggplot(aes(xlabs,ID)) + 
  geom_tile(aes(fill = numbers),colour = "white") +
  facet_rep_grid(frws ~ fcols,scale="free")+
  scale_fill_gradientn( colors = c("white","green","red"),values = rescale (c(0,1.0,2.5)))

输出:

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...