我有来自统计测试(基因集富集分析,但这并不重要)的数据,所以我获得了正态分布的统计数据的p值,即正负值:
测试在几个类别上运行:
set.seed(1)
df <- data.frame(col = rep(1,7),
category = LETTERS[1:7],
stat.sign = sign(rnorm(7)),
p.value = runif(7, 0, 1),
stringsAsFactors = TRUE)
我想将这些数据显示在一个geom_tile
ggplot
中,这样我就可以将df$category
的颜色编码为它们的df$p.value
乘以它们的df$stat.sign
(即统计数字的符号)。
为此,我首先选择了log10
of df$p.value
df$sig <- df$stat.sign*(-1*log10(df$p.value))
然后我用order
df
by df$sig
来表示df$sig:
的每个符号
library(dplyr)
df <- rbind(dplyr::filter(df, sig < 0)[order(dplyr::filter(df, sig < 0)$sig), ],
dplyr::filter(df, sig > 0)[order(dplyr::filter(df, sig > 0)$sig), ])
然后我ggplot
它:
library(ggplot2)
df$category <- factor(df$category, levels=df$category)
ggplot(data = df,
aes(x = col, y = category)) +
geom_tile(aes(fill=sig)) +
scale_fill_gradient2(low='darkblue', mid='white', high='darkred') +
theme_minimal() +
xlab("") + ylab("") + labs(fill="-log10(P-Value)") +
theme(axis.text.y = element_text(size=12, face="bold"),
axis.text.x = element_blank())
这给了我:
是否有一种方法可以操纵legend
,使df$sig
的值用它们的绝对值来表示,但其他的一切都保持不变?这样,我仍然可以得到红色和蓝色的阴影,并维持我想要的秩序。
发布于 2017-10-11 17:52:30
如果您检查ggplot的文档,scale_fill_gradient2
和其他连续缩放一样,它的labels
参数接受以下内容之一:
NULL
waiver()
用于为置换对象计算的默认标签。breaks
长度相同)因为您只希望图例值是绝对的,所以我假设您对图例颜色栏中的默认分隔符(-0.1到0.4,增量为0.1)感到满意,所以您真正需要的是添加一个操作标签的函数。
即:而不是这样:
scale_fill_gradient2(low = 'darkblue', mid = 'white', high = 'darkred') +
用这个:
scale_fill_gradient2(low = 'darkblue', mid = 'white', high = 'darkred',
labels = abs) +
发布于 2017-10-11 15:10:47
我不知道我是否明白你在找什么。你的意思是你不想在传说中改变标签?如果你想改变标签,操纵breaks
和labels
由scale_fill_gradient2()
给它应该这样做。
ggplot(data=df,aes(x=col,y=category)) +
geom_tile(aes(fill=sig)) +
scale_fill_gradient2(low='darkblue',mid='white',high='darkred',
breaks = order(unique(df$sig)),
labels = abs(order(unique(df$sig)))) +
theme_minimal()+xlab("")+ylab("")+labs(fill="-log10(P-Value)") +
theme(axis.text.y=element_text(size=12,face="bold"),axis.text.x=element_blank())
对于您正在寻找的内容,也许您可以在图中显示文本以显示值,请尝试像这样堆叠stat_bin_2d()
:
ggplot(data=df,aes(x=col,y=category)) +
geom_tile(aes(fill=sig)) +
scale_fill_gradient2(low='darkblue',mid='white',high='darkred',
breaks = order(unique(df$sig)),
labels = abs(order(unique(df$sig)))) +
theme_minimal()+xlab("")+ylab("")+labs(fill="-log10(P-Value)") +
stat_bin_2d(geom = 'text', aes(label = sig), colour = 'black', size = 16) +
theme(axis.text.y=element_text(size=12,face="bold"),axis.text.x=element_blank())
您可能需要尝试一下size
和colour
参数。
https://stackoverflow.com/questions/46698690
复制