R ggplot2:双x轴负条形图

R ggplot2:双x轴负条形图,r,ggplot2,R,Ggplot2,我想制作如下图表: 我遵循以下准则: dat <- data.frame( name1 = c("A", "B", "C", "D", "E"), name2 = c("F", "G", "H", "I", "J"), value = c(-12,10,5,-7,-2) ) g

我想制作如下图表:

我遵循以下准则:

dat <- data.frame(
  name1 = c("A", "B", "C", "D", "E"),
  name2 = c("F", "G", "H", "I", "J"),
  value = c(-12,10,5,-7,-2)
)

ggplot(dat,aes(x = name1,y = value)) +
  geom_bar(stat = "identity",
           fill = "#465978",
           width = 0.3) +
  ylim(-50,50) +
  geom_hline(yintercept = 0,
             color = "#9e9e9e",
             alpha = 0.3,
             linetype = "dotted") +
  coord_flip() +
  theme_bw() +
  theme(axis.line = element_blank(),
        axis.title = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_text(colour = "#737373"),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank())

dat通常(使用连续刻度),我建议
scale\u y\u continuous(秒轴=…)
。不幸的是,
scale\u discrete
还不支持它(请参阅)。这样,两种方法包括
geom_text
annotation
s。我会提供第一个

要使其在两侧一致,我们需要从左轴移除轴标签。(我觉得这很烦人,但轴之间的一致性对我来说很重要。如果对您来说不太重要,那么您可以减少一些更改。)

ggplot(dat,aes(x=name1,y=value))+
几何图形栏(stat=“identity”,
fill=“#465978”,
宽度=0.3)+
ylim(-50,50)+
geom_hline(yintercept=0,
color=“#9e9e9e”,
α=0.3,
linetype=“虚线”)+
geom_文本(aes(y=-Inf,label=name1),hjust=0,color=“#737373”)+#新
几何图形文本(aes(y=Inf,label=name2),hjust=1,color=“#737373”)+#新
coord_flip()+
主题_bw()+
主题(axis.line=element_blank(),
axis.title=元素_blank(),
axis.text.x=元素_blank(),
axis.text.y=元素_blank(),#更改
axis.ticks=元素_blank(),
panel.grid.major=元素_blank(),
panel.grid.minor=元素_blank(),
panel.border=元素_blank(),
panel.background=element\u blank()

使用多行标签(如示例中所示)会遇到的一个问题是对齐
ggplot2
有一种混淆的含义,即文本框从点的方向和文本框内文本的对齐方式。因此
hjust=0
表示“文本位于点的右侧,文本左对齐”。似乎没有一种简单的方法可以让文本框位于点的右侧(第一个
geom_text
,位于左边缘),但要使文本右对齐。(如果有人能拿出一个简单的方法来解决这个问题,我会很高兴的!)

强制左边缘右对齐文本框的解决方法需要事先知道打印的尺寸,以便您可以将文本框(不是
y=-Inf
,左边缘)硬定位在打印边界内,并硬编码打印的限制。(要知道,在形成打印时,所有函数都不知道渲染打印的尺寸,以用户点、厘米或类似单位表示。)


另外,我们可以添加
geom_文本
geom_瓷砖
,以获得更多功能

ggplot(dat,aes(x=name1,y=value))+
geom_瓷砖(高度=90,宽度=0.3,填充=“灰色90”)+
几何图形栏(stat=“identity”,
fill=“#465978”,
宽度=0.3)+
ylim(-50,50)+
geom_hline(yintercept=0,
color=“#9e9e9e”,
α=0.3,
linetype=“虚线”)+
几何图形文本(aes(y=-Inf,label=name1),hjust=0,color=“#7373”)+
几何图形文本(aes(y=Inf,label=name2),hjust=1,color=“#7373”)+
几何图形文本(aes(标签=值),vjust=-1.1)+
coord_flip()+
主题_bw()+
主题(axis.line=element_blank(),
axis.title=元素_blank(),
axis.text.x=元素_blank(),
axis.text.y=元素_blank(),
axis.ticks=元素_blank(),
panel.grid.major=元素_blank(),
panel.grid.minor=元素_blank(),
panel.border=元素_blank(),
panel.background=element\u blank()
. + > ggplot(数据,aes(x=name1,y=value))+
geom_瓷砖(aes(y=0),高度=90,宽度=0.3,填充=“灰色90”)+
几何图形栏(stat=“identity”,
fill=“#465978”,
宽度=0.3)+
ylim(-50,50)+
geom_hline(yintercept=0,
color=“#9e9e9e”,
α=0.3,
linetype=“虚线”)+
几何图形文本(aes(y=-Inf,label=name1),hjust=0,color=“#7373”)+
几何图形文本(aes(y=Inf,label=name2),hjust=1,color=“#7373”)+
几何图形文本(aes(标签=值),vjust=-1.1)+
coord_flip()+
主题_bw()+
主题(axis.line=element_blank(),
axis.title=元素_blank(),
axis.text.x=元素_blank(),
axis.text.y=元素_blank(),
axis.ticks=元素_blank(),
panel.grid.major=元素_blank(),
panel.grid.minor=元素_blank(),
panel.border=元素_blank(),
panel.background=element\u blank()

通常情况下(使用连续刻度),我建议
连续刻度(秒轴=…)
。不幸的是,
scale\u discrete
还不支持它(请参阅)。这样,两种方法包括
geom_text
annotation
s。我会提供第一个

要使其在两侧一致,我们需要从左轴移除轴标签。(我觉得这很烦人,但轴之间的一致性对我来说很重要。如果对您来说不太重要,那么您可以减少一些更改。)

ggplot(dat,aes(x=name1,y=value))+
几何图形栏(stat=“identity”,
fill=“#465978”,
宽度=0.3)+
ylim(-50,50)+
geom_hline(yintercept=0,
color=“#9e9e9e”,
α=0.3,
linetype=“虚线”)+
geom_文本(aes(y=-Inf,label=name1),hjust=0,color=“#737373”)+#新
几何图形文本(aes(y=Inf,label=name2),hjust=1,color=“#737373”)+#新
coord_flip()+
主题_bw()+
主题(axis.line=element_blank(),
axis.title=元素_blank(),
axis.text.x=元素_blank(),
axis.text.y=元素_blank(),#更改
axis.ticks=元素_blank(),
panel.grid.major=元素_blank(),
panel.grid.minor=元素_blank(),
panel.border=元素_blank(),
panel.background=element\u blank()