ggplot2 geom_text 水平分组条形图上的位置文本
ggplot2 geom_text position text on horizontal grouped barplot
您好,我正在为在正确位置的分组水平条形图中获取标签而苦苦挣扎。我知道以前有过类似的问题,但我似乎没有得到有效的答案。
我的数据("Correlation")是这样的:
Trait r se Disease significant
1 0.4 0.06 A *
1 0.1 0.06 B
1 -0.05 0.03 C
2 0.4 0.06 A *
2 0.1 0.05 B
2 -0.06 0.03 C *
3 0.04 0.06 A *
3 0.2 0.05 B *
3 0.3 0.04 C *
还有我的代码:
grouped_plot <- ggplot(data=Correlation, aes(x=Trait, y=r,
fill=Disease)) + geom_bar(stat="identity", position="dodge",
width=0.9)+ geom_errorbar(aes(ymin = r - se, ymax = r + se),
width = 0.3, position=position_dodge(0.9), stat="identity",
color=rgb(100,100,100, maxColorValue = 255)) + coord_flip() +
theme_minimal() +
scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +
theme(legend.position="none") + ggtitle("XXX") + theme(plot.title =
element_text(size=11) )
grouped_plot + geom_text(aes(x=Trait, y=r + 0.07 * sign(r),
label=format(significant), hjust=ifelse(r>0,0,1)),
position=position_dodge(0.9), size=5, color=rgb(100,100,100,
maxColorValue = 255) )
但是无论我如何调整参数,星星都不会完全垂直居中 + 每次到误差线的距离都不同:
将 "se" 添加到 geom_text 中的 y-parameter 也不会使星星与 error-bars 的距离相同(对于 error-bars朝负方向移动)
grouped_plot + geom_text(aes(x=Trait, y=r +se + 0.01 * sign(r),
label=format(significant), hjust=ifelse(r>0,0,1)),
position=position_dodge(0.9), size=5, color=rgb(100,100,100, maxColorValue
= 255) )
有人有解决办法吗?我会非常感激
使用 hjust
的一个值和 aes
之外的一些 angle
ggplot(data=d, aes(x=Trait, y=r, fill=Disease)) +
geom_col(position = position_dodge(width = 0.9), show.legend = F)+
geom_errorbar(aes(ymin = r - se, ymax = r + se),
width = 0.3, position=position_dodge(width=0.9)) +
coord_flip() +
scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +
theme_minimal() +
geom_text(aes(x=Trait, y=r + se + 0.01 * sign(r),
label=format(significant)), position=position_dodge(width = 0.9),
angle =270, hjust=.3)
就像我在上面的评论中提到的那样,我认为存在印刷问题:星号字符设置为略微上标,因此它悬停在您期望的中心线上。我没有使用那个特定的字符,而是尝试使用 geom_point
来获得比 geom_text
更多的控制,然后将重要性变量映射到形状。我稍微更改了数据,以创建一个 is_sig
列,其中包含每个观察值的值,因为当有 NA
个值时,我很难将它们排列起来(使躲避变得困难)。
我使用的另一个技巧是将符号定位在误差线之外。我设置了一个变量 gap
来为每颗星保持统一的偏移量,然后在 geom_point
中计算 y 位置为 r
加上或减去标准误差 + 间隙。
乱用所用的形状;这是我可以快速获得的最接近您的星号的字符,但是您可能可以输入一个 unicode 字符。在我的 Mac 上,我可以很容易地得到一个星形字符,但是你需要一个额外的步骤来让那个 unicode 字符显示在情节中。也查看 shape reference。
在 geom_point
中,设置 show.legend = F
以防止点出现在图例中。或者省略它,并创建一个形状图例来显示星号的含义。请注意那些 NA
形状正在被删除的警告。
library(dplyr)
library(readr)
library(ggplot2)
# ... reading data
df2 <- df %>%
mutate(is_sig = ifelse(is.na(significant), "not significant", "significant"))
gap <- 0.01
ggplot(df2, aes(x = as.factor(Trait), y = r, fill = Disease, group = Disease)) +
geom_col(position = position_dodge(width = 0.9), width = 0.9) +
geom_errorbar(aes(ymin = r - se, ymax = r + se), position = position_dodge(width = 0.9), width = 0.3) +
geom_point(aes(shape = is_sig, y = r + sign(r) * (se + gap)), position = position_dodge(width = 0.9),
size = 2, show.legend = F) +
coord_flip() +
scale_shape_manual(values = c("significant" = 8, "not significant" = NA))
#> Warning: Removed 3 rows containing missing values (geom_point).
由 reprex package (v0.2.0) 创建于 2018-07-30。
您好,我正在为在正确位置的分组水平条形图中获取标签而苦苦挣扎。我知道以前有过类似的问题,但我似乎没有得到有效的答案。
我的数据("Correlation")是这样的:
Trait r se Disease significant
1 0.4 0.06 A *
1 0.1 0.06 B
1 -0.05 0.03 C
2 0.4 0.06 A *
2 0.1 0.05 B
2 -0.06 0.03 C *
3 0.04 0.06 A *
3 0.2 0.05 B *
3 0.3 0.04 C *
还有我的代码:
grouped_plot <- ggplot(data=Correlation, aes(x=Trait, y=r,
fill=Disease)) + geom_bar(stat="identity", position="dodge",
width=0.9)+ geom_errorbar(aes(ymin = r - se, ymax = r + se),
width = 0.3, position=position_dodge(0.9), stat="identity",
color=rgb(100,100,100, maxColorValue = 255)) + coord_flip() +
theme_minimal() +
scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +
theme(legend.position="none") + ggtitle("XXX") + theme(plot.title =
element_text(size=11) )
grouped_plot + geom_text(aes(x=Trait, y=r + 0.07 * sign(r),
label=format(significant), hjust=ifelse(r>0,0,1)),
position=position_dodge(0.9), size=5, color=rgb(100,100,100,
maxColorValue = 255) )
但是无论我如何调整参数,星星都不会完全垂直居中 + 每次到误差线的距离都不同:
将 "se" 添加到 geom_text 中的 y-parameter 也不会使星星与 error-bars 的距离相同(对于 error-bars朝负方向移动)
grouped_plot + geom_text(aes(x=Trait, y=r +se + 0.01 * sign(r),
label=format(significant), hjust=ifelse(r>0,0,1)),
position=position_dodge(0.9), size=5, color=rgb(100,100,100, maxColorValue
= 255) )
有人有解决办法吗?我会非常感激
使用 hjust
的一个值和 aes
angle
ggplot(data=d, aes(x=Trait, y=r, fill=Disease)) +
geom_col(position = position_dodge(width = 0.9), show.legend = F)+
geom_errorbar(aes(ymin = r - se, ymax = r + se),
width = 0.3, position=position_dodge(width=0.9)) +
coord_flip() +
scale_y_continuous(breaks=seq(-0.8,0.8,by=0.1)) +
theme_minimal() +
geom_text(aes(x=Trait, y=r + se + 0.01 * sign(r),
label=format(significant)), position=position_dodge(width = 0.9),
angle =270, hjust=.3)
就像我在上面的评论中提到的那样,我认为存在印刷问题:星号字符设置为略微上标,因此它悬停在您期望的中心线上。我没有使用那个特定的字符,而是尝试使用 geom_point
来获得比 geom_text
更多的控制,然后将重要性变量映射到形状。我稍微更改了数据,以创建一个 is_sig
列,其中包含每个观察值的值,因为当有 NA
个值时,我很难将它们排列起来(使躲避变得困难)。
我使用的另一个技巧是将符号定位在误差线之外。我设置了一个变量 gap
来为每颗星保持统一的偏移量,然后在 geom_point
中计算 y 位置为 r
加上或减去标准误差 + 间隙。
乱用所用的形状;这是我可以快速获得的最接近您的星号的字符,但是您可能可以输入一个 unicode 字符。在我的 Mac 上,我可以很容易地得到一个星形字符,但是你需要一个额外的步骤来让那个 unicode 字符显示在情节中。也查看 shape reference。
在 geom_point
中,设置 show.legend = F
以防止点出现在图例中。或者省略它,并创建一个形状图例来显示星号的含义。请注意那些 NA
形状正在被删除的警告。
library(dplyr)
library(readr)
library(ggplot2)
# ... reading data
df2 <- df %>%
mutate(is_sig = ifelse(is.na(significant), "not significant", "significant"))
gap <- 0.01
ggplot(df2, aes(x = as.factor(Trait), y = r, fill = Disease, group = Disease)) +
geom_col(position = position_dodge(width = 0.9), width = 0.9) +
geom_errorbar(aes(ymin = r - se, ymax = r + se), position = position_dodge(width = 0.9), width = 0.3) +
geom_point(aes(shape = is_sig, y = r + sign(r) * (se + gap)), position = position_dodge(width = 0.9),
size = 2, show.legend = F) +
coord_flip() +
scale_shape_manual(values = c("significant" = 8, "not significant" = NA))
#> Warning: Removed 3 rows containing missing values (geom_point).
由 reprex package (v0.2.0) 创建于 2018-07-30。