从绘图中检索轴刻度信息

时间:2018-11-13 18:57:43

标签: r plotly axis-labels

我正在使用R plotly绘制热图:

set.seed(1)
df <- reshape2::melt(matrix(rnorm(100*20),100,20,dimnames = list(paste0("G",1:100),paste0("S",1:20))))

library(plotly)
library(dplyr)
plot_ly(z=c(df$value),x=df$Var2,y=df$Var1,colors=grDevices::colorRamp(c("darkblue","gray","darkred")),type="heatmap",colorbar=list(title="Scaled Value",len=0.4)) %>%
  layout(yaxis=list(title=NULL),xaxis=list(tickangle=90,tickvals=10,ticktext="X-Label"))

enter image description here

如您所见,plotly并未显示所有y轴刻度。我的问题是,是否有可能,如果可以的话,如何检索选择显示的y轴刻度标签plotly

我保存了绘图对象:

plotly.obj <- plot_ly(z=c(df$value),x=df$Var2,y=df$Var1,colors=grDevices::colorRamp(c("darkblue","gray","darkred")),type="heatmap",colorbar=list(title="Scaled Value",len=0.4)) %>%
  layout(yaxis=list(title=NULL),xaxis=list(tickangle=90,tickvals=10,ticktext="X-Label"))

环顾四周,似乎plotly.obj$x$layoutAttrs应该存储此信息,但事实并非如此:

> plotly.obj$x$layoutAttrs
$`102ce55fd393e`
$`102ce55fd393e`$yaxis
$`102ce55fd393e`$yaxis$title
NULL


$`102ce55fd393e`$xaxis
$`102ce55fd393e`$xaxis$tickangle
[1] 90

$`102ce55fd393e`$xaxis$tickvals
[1] 10

$`102ce55fd393e`$xaxis$ticktext
[1] "X-Label"

有什么主意吗?

2 个答案:

答案 0 :(得分:1)

我认为您无法获得刻度线,这些刻度线最终被渲染了。但是,您可以获得y轴可以选择的所有水平轴。

levels(plotly.obj$x$attrs$`2c4c148651ae`$y)

最终绘制的刻度线是动态选择的,并将根据您的绘图大小等进行调整。

您还可以使用plotly_json()签出属性:

plot_ly(z=c(df$value),x=df$Var2,y=df$Var1,colors=grDevices::colorRamp(c("darkblue","gray","darkred")),type="heatmap",colorbar=list(title="Scaled Value",len=0.4)) %>%
      layout(yaxis=list(title=NULL),xaxis=list(tickangle=90,tickvals=10,ticktext="X-Label")) %>% 
      plotly_json()

答案 1 :(得分:0)

我从发布在github上的issue ropensci/plotly中获得了answer

set.seed(1)
df <- reshape2::melt(matrix(rnorm(100*20),100,20,dimnames = list(paste0("G",1:100),paste0("S",1:20))))

library(plotly)
library(dplyr)
plot_ly(z=c(df$value),x=df$Var2,y=df$Var1,colors=grDevices::colorRamp(c("darkblue","gray","darkred")),type="heatmap",colorbar=list(title="Scaled Value",len=0.4)) %>%
  layout(yaxis=list(title=NULL),xaxis=list(tickangle=90,tickvals=10,ticktext="X-Label")) %>% 
  htmlwidgets::onRender(
    "function(el, x) {
       alert(el._fullLayout.yaxis._vals.map(function(i) { return i.text; }));
    }"
  )

将弹出带有刻度标签的浏览器窗口。

现在的问题是,是否可以将其保存/通过管道传输到R变量或写入文件,以便可以自动完成而不是交互操作。这将是另一篇文章。