简体   繁体   English

添加自定义的x轴以绘制ggplot2和y轴

[英]Add a customized x-axis to plot ggplot2 and y-axis as well

I have the following code: 我有以下代码:

df=data.frame(time=as.factor(rep(0.5:9.5,each=10)),
              roi=rep(1:10,10),
              area=runif(100, 5.0, 7.5))

df$time=factor(df$time, levels=rev(levels(df$time)))  

ggplot(data=df, aes(x=factor(roi), y=time, fill = area)) + 
   theme_minimal() + coord_fixed(ratio=1) + 
   geom_tile(colour = NA, width = 1.5, height = 1) + 
   scale_fill_gradient(low="black",high="white")

Now, I want to remove the x-axis and add a new one to have the expected fig below. 现在,我想删除x轴并添加一个新轴,以得到下面的预期图。 The x-axis will be divided into 4 parts for 4 segs with 39%,23%,23%,15% of axis length for Seg 1, Seg 2, Seg 3, Seg 4, respectively. x轴将被分为4个段的4个部分,分别为段1,段2,段3,段4的轴长的39%,23%,23%,15%。 Could anybody hava any idea to solve it. 有人可以解决这个问题吗? I apprecicate all response and am looking forward your answers. 我感谢所有答复,并期待您的答复。

Great thanks to Mark Heckmann for helpful answer to my problem. 非常感谢Mark Heckmann对我的问题的有用回答。 I would like to ask one more thing. 我还要再问一件事。 I also want to modify the y-axis by "scale_y_discrete", the code ran well but the y-axis label did not meet my expectation. 我还想通过“ scale_y_discrete”修改y轴,代码运行良好,但是y轴标签不符合我的期望。 The code I ran is: 我运行的代码是:

ggplot(data=df, aes(x=factor(roi), y=time, fill = area)) + theme_minimal() +coord_fixed(ratio=1) +geom_tile(colour = NA, width = 1.5, height = 1)+scale_fill_gradient(low="black",high="white") +scale_y_discrete(name="Time (min)",expand =c(0.01,0.1),breaks=c(1,2.5,5.0,7.5,10.0),labels=c(0,15,30,45,60))

Thank you very much! 非常感谢你!

在此处输入图片说明

This is as good as I can get without going into custom annotation grobs. 这与不使用自定义批注杂点而获得的效果一样好。

library(ggplot2)
library(grid)
df=data.frame(time=as.factor(rep(0.5:9.5,each=10)),
              roi=rep(1:10,10),area=runif(100, 5.0, 7.5)) 
df$time=factor(df$time, levels=rev(levels(df$time)))
p1 <- ggplot(data=df, aes(x=factor(roi), y=time, fill = area)) + 
  theme_minimal() +coord_fixed(ratio=1) +
  geom_tile(colour = NA, width = 1.5, height = 1)+
  scale_fill_gradient(low="black",high="white") + 
  scale_x_discrete(breaks = c(4,6,8,10),
                   labels = paste0("Seg",1:4)) +
  theme(axis.title.x = element_blank(),
        axis.ticks.x = element_line(size =1),
        axis.text.x = element_text(hjust=c(2,1.5,1.5,1.5)),
        plot.margin = unit(c(2,0,2,0), "lines"))

See here if you want to look into drawing the axis labels and tick marks customwise. 如果要自定义绘制轴标签和刻度线,请参见此处

You need to use annotation_custom to draw outside the plotting area. 您需要使用annotation_custom在绘图区域之外进行绘制。

#### your plot

library(ggplot2)

g <- ggplot(data=df, aes(x=factor(roi), y=time, fill = area)) + 
  theme_minimal() + coord_fixed(ratio=1) +
  geom_tile(colour = NA, width = 1.5, height = 1) + 
  scale_fill_gradient(low="black",high="white") 

Extra code: 额外的代码:

library(grid)

# remove axis 
g <- g +  theme(axis.title.x=element_blank(),
             axis.text.x=element_blank(),
              axis.ticks.x=element_blank()) +
          scale_x_discrete(expand = c(0,0)) 

# calculate segment coordinates
segs <- c(.39, .23, .23, .15)
segs_center <- cumsum(segs) - segs/2
seg_ticks <- cumsum(segs)[1:3]
seg_labels <- paste("Seg", seq_along(segs))

# create graphicaal objects and gather as tree
grobs <- grobTree(linesGrob(c(0,1), c(.5,.5)),
                  segmentsGrob(x0=seg_ticks, x1=seg_ticks, y0=0, y1=1),
                  textGrob(x=segs_center, y=0, 
                           label = seg_labels, hjust = .5, gp = gpar(cex =.7)))

# insert grobsTree in as annotation
g <- g + annotation_custom( grob = grobs,  
                            ymin = -.2, ymax = .2, 
                            xmin = .25, xmax = 10.75)

# override clipping for plotting outside of plotting area
gt <- ggplot_gtable(ggplot_build(g))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.newpage()  
grid.draw(gt)

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM