4

我正在使用带有 Rshiny 的 plotly 来创建带有文本标签的散点图。下面是一个可重现的例子:

library(ggplot2)
library(plotly)
dat <- data.frame(LongExpressionValue = rnorm(1:100), 
                  LongMethylationValue = rnorm(1:100), 
                  LongCopyNumberValue = rnorm(1:100))

rownames(dat) <- paste0('n',seq(1:100))

# ggplot
p <- ggplot(data = dat, aes(x = LongExpressionValue, y = LongMethylationValue)) + 
  geom_point(size = 2) + geom_smooth(method = lm) +
  geom_text(aes(label = rownames(dat)), vjust=-1.5, size = 3)

# ggplotly
ggplotly(p)

这将创建一个图,如:

在此处输入图像描述

如何调整我的 geom_text 选项以使标签出现在上方而不与点重叠?我确实想保留我的 ggplot 代码,以便在应用程序中使用它。

谢谢!

4

3 回答 3

3

尝试这个:

plot_ly(data = dat, 
        x = LongExpressionValue, 
        y = LongMethylationValue, 
        text = rownames(dat), 
        marker = list(size = 10), 
        mode = "markers+text",
        textposition = 'top center')

当您可以直接访问源代码时,不值得在 ggplot2 上努力工作。这是无价的:https ://plot.ly/r/reference/

plot_ly或中layout的所有内容都是列表列表,因此您可以轻松设置参数(注意marker = list(size = 10)

编辑:一个稍微复杂一点的显示 hoverinfo + text 的力量:

plot_ly(data = dat, 
        x = LongExpressionValue, 
        y = LongMethylationValue, 
        text = paste0(rownames(dat), 
                      '<br>A:', 1:nrow(dat), #Examples of additional text
                      '<br>B:', sample(nrow(dat))), #Examples of additional text
        hoverinfo = 'text+x+y',
        marker = list(size = 10), 
        mode = "markers+text",
        hoverinfo = 'text',
        textposition = 'top right')
于 2016-05-16T19:28:38.883 回答
1

如果您想坚持使用 ggplot2 并保持平滑线,您可以稍微增加点的大小并在每个点内添加标签:

p <- ggplot(data = dat, aes(x = LongExpressionValue, y = LongMethylationValue)) + 
  geom_point(size = 7) + geom_smooth(method = lm) +
  geom_text(aes(label = rownames(dat)), size = 2, color="white")

# ggplotly
ggplotly(p)

在此处输入图像描述

于 2016-05-16T19:58:17.280 回答
1

如果您想留在ggplot2中,则必须将一个textposition元素附加到plotly_build列表中。即使设置了和选项textposition,原始文件中也缺少。plotly_buildhjustvjust

所以这有效:

#devtools::install_github("ropensci/plotly") # if not already done
library(ggplot2)
library(plotly) 
dat <- data.frame(LongExpressionValue = rnorm(1:100),
              LongMethylationValue = rnorm(1:100),
              LongCopyNumberValue = rnorm(1:100))

rownames(dat) <- paste0('n',seq(1:100))  

gg <- ggplot(data = dat, aes(x = LongExpressionValue, y =LongMethylationValue)) + 
geom_point(size = 1) +
geom_smooth(method = lm) +
geom_text(aes(label = rownames(dat)), size = 3)

p <- plotly_build(gg)

length<-length(p$x$data)
invisible(lapply(1:length, function(x) p$x$data[[x]]<<-c(p$x$data[[x]], textposition ='top center')))

p

于 2016-07-27T14:30:56.177 回答