如何在ggplot2中添加坐标轴标签而不中断?

3
我有两个变量(V1,V2),需要在简单的散点图中相互绘制。有些行缺少V1或V2,因此不会包括在绘图中,但这些行中仍然存在的信息仍然很重要。
因此,我尝试用数据范围之外的值替换NAs,并在轴上添加“NA”标签,但“breaks”和“labels”的要求必须具有相同的长度,这会导致出现额外的网格线。
是否可能在没有断点的情况下具有轴标签?非常感谢任何建议!
由于我是stackoverflow的新手,所以很抱歉无法发布图片来说明我的问题。希望下面的代码和链接足够了。
# Simulated example data
library(ggplot2)
set.seed(112)
DF<-data.frame(V1=rnorm(20,10,4))
DF$V2<-DF$V1+rnorm(20,0,1)
DF[sample(1:dim(DF)[1],2),]$V1<-NA
DF[sample(1:dim(DF)[1],2),]$V2<-NA

# plot with NA rows removed
ggplot(DF,aes(x=V1,y=V2))+geom_point()+theme_bw()

# substitute NAs with value outside data range
DF$WasNA<-apply(DF,1,function(x)any(is.na(x)))
DF[is.na(DF$V1),]$V1<- -1
DF[is.na(DF$V2),]$V2<- -1
(p<-ggplot(DF,aes(x=V1,y=V2,colour=WasNA))+
    geom_point()+
    scale_colour_manual(values=c("black","grey70"))+
    theme_bw())
p+
    scale_x_continuous(breaks=c(-1,ggplot_build(p)$layout$panel_params[[1]]$x.major_source),labels=c("NA",ggplot_build(p)$layout$panel_params[[1]]$x.labels))+
    scale_y_continuous(breaks=c(-1,ggplot_build(p)$layout$panel_params[[1]]$y.major_source),labels=c("NA",ggplot_build(p)$layout$panel_params[[1]]$y.labels))

示例图

(另外值得一提的是,我不确定为什么我添加的额外换行符也会在刻度的上端镜像出现?)


3
您可以通过将网格主题元素设置为空来删除标准网格线,并使用 geom_vlinegeom_hline 在需要的位置创建网格线。另一个选项是使用 naniar 中的 geom_miss_point 更自动化地在绘图中包含缺失数据。还可以参考naniar 文献 - eipi10
2个回答

1
看起来你想要一种绘图方法来帮助在ggplot中显示缺失值?naniar中有一个几何体可以做到这一点 - geom_miss_point()


# Simulated example data
library(ggplot2)
set.seed(112)
DF<-data.frame(V1=rnorm(20,10,4))
DF$V2<-DF$V1+rnorm(20,0,1)
DF[sample(1:dim(DF)[1],2),]$V1<-NA
DF[sample(1:dim(DF)[1],2),]$V2<-NA

# plot with NA rows removed
ggplot(DF,aes(x=V1,y=V2))+geom_point()+theme_bw()
#> Warning: Removed 4 rows containing missing values (geom_point).

# plot with naniar - using shadow_shift
library(naniar)
ggplot(DF, 
       aes(x = V1, 
           y = V2)) + 
  geom_miss_point() +
  theme_bw()

naniar通过转换数据范围下面的值(就像您所做的那样),然后绘图来实现此目的。它还有其他辅助工具来查看缺失数据。
如果您有任何问题,请告诉我!

0

如果您使用带有背景网格的绘图设计,则我认为需要在NA位置添加一个网格线。否则,绘图会看起来很奇怪。

因此,我的建议是摆脱次要网格线。这样就消除了不该出现的奇怪额外线条的问题。

p + scale_x_continuous(breaks=c(-1, ggplot_build(p)$layout$panel_params[[1]]$x.major_source),
                       labels=c("NA", ggplot_build(p)$layout$panel_params[[1]]$x.labels)) +
    scale_y_continuous(breaks=c(-1, ggplot_build(p)$layout$panel_params[[1]]$y.major_source),
                       labels=c("NA", ggplot_build(p)$layout$panel_params[[1]]$y.labels)) +
    theme(panel.grid.minor = element_blank())

enter image description here

如果你想要更多的网格线,你可以定义额外的断点(比如在2.5、7.5、12.5位置),并给它们一个空标签。这样就可以模拟出次要网格线,而且位置也正好符合你的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接