使用数据列设置标记像素大小

Posted

技术标签:

【中文标题】使用数据列设置标记像素大小【英文标题】:Set marker pixel size in plotly using a column of your data 【发布时间】:2017-09-16 05:46:25 【问题描述】:

我正在尝试使用数据中的列设置标记大小,但是值为 1、2、5 等的标记大小会根据基础数据而变化。是否可以使用精确的像素大小设置标记的大小?这样,当我的数据更改时,相同大小的标记将始终具有相同的关联值,而不管基础数据如何。

这是一个简单的例子:

第一个显示所有标记都很大(绝对不是您从变量 n 解释的 1px。

library(plotly)

dat <- data.frame(y=factor(c(1,1,2,2),levels=c(1,2),labels=c("GRP1","GRP2")),
                  x=c(1,2,3,4),
                  n=c(1,1,1,1),
                  grp=c("GRP1","GRP1","GRP2","GRP2"))

plot_ly(dat) %>%
  add_markers(x = ~x, 
              y = ~y, color = ~grp, 
              size = ~n, 
              opacity = .7) %>%
  layout(showlegend=F)

第二个已调整大小,但仅在一组中。两组之间的大小为 1 略有不同。

dat2 <- data.frame(y=factor(c(1,1,2,2),levels=c(1,2),labels=c("GRP1","GRP2")),
                   x=c(1,2,3,4), 
                   n=c(1,2,1,1),
                   grp=c("GRP1","GRP1","GRP2","GRP2"))

plot_ly(dat2) %>%
  add_markers(x = ~x, 
              y = ~y, color = ~grp, 
              size = ~n, 
              opacity = .7) %>%
  layout(showlegend=F)

我尝试使用 sizesmarker=list(sizeref=0.1,sizemode="area") 选项,但这些选项似乎只能解决部分问题。

plot_ly(dat2) %>%
  add_markers(x = ~x, 
              y = ~y, color = ~grp, 
              size = ~n, 
              sizes = c(10,50),
              opacity = .7) %>%
  layout(showlegend=F)

plot_ly(dat2) %>%
  add_markers(x = ~x, 
              y = ~y, color = ~grp, 
              size = ~n, 
              marker=list(sizeref=0.1, sizemode="area"),
              opacity = .7) %>%
  layout(showlegend=F)

我正在寻找一种简单的方法来提供每个标记的大小,方法是明确地给出以像素为单位的大小。我还尝试在size = ~n 中删除~,但这只会给我一个错误。我错过了什么……这可能吗?

谢谢。

编辑:

这个例子清楚地说明了这个问题,注意我将大小乘以 400,dat2 的定义如上:

plot_ly(dat2) %>%
  add_markers(x = ~x, 
              y = ~y,  color = ~grp, 
              size = ~I(400*n), 
              text = ~paste0("Size of marker: ",n),
              opacity = .7,
              type="scatter") %>%
  layout(showlegend=F)

两个蓝点(大小为 400*1)与第一个绿点(大小为 400*1)大小不同。

> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
[1] plotly_4.5.6  ggplot2_2.2.1

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.10       knitr_1.15.1       magrittr_1.5       munsell_0.4.3      colorspace_1.3-2   viridisLite_0.2.0 
 [7] R6_2.2.0           stringr_1.2.0      httr_1.2.1         plyr_1.8.4         dplyr_0.5.0        tools_3.3.3       
[13] grid_3.3.3         gtable_0.2.0       DBI_0.6-1          htmltools_0.3.5    yaml_2.1.14        lazyeval_0.2.0    
[19] assertthat_0.2.0   digest_0.6.12      rprojroot_1.2      tibble_1.3.0       purrr_0.2.2        RColorBrewer_1.1-2
[25] tidyr_0.6.1        base64enc_0.1-3    htmlwidgets_0.8    evaluate_0.10      rmarkdown_1.4      stringi_1.1.5     
[31] backports_1.0.5    scales_0.4.1       jsonlite_1.4      

【问题讨论】:

这是一个情节相关的问题,我认为你可以删除闪亮的标签 由于反应性闪亮对象而存在问题...可以更改基础数据,并且新绘图会绘制不同大小的标记。无论来自闪亮的反应对象的数据如何,我都希望 1 或 2 的大小完全相同。 如果是这样,请发布一个使用闪亮的最小可重现示例 【参考方案1】:

根据github 上的cpsievert 的答案是在marker 参数中使用size 的低级控件:

plot_ly(x = 1:4, y = 1:4, size = 1:4, marker = list(size = 4:1 * 10, sizemode = "diameter"))

使用他的示例,我的代码现在变为:

library(plotly)

dat <- data.frame(y=factor(c(1,1,2,2),levels=c(1,2),labels=c("GRP1","GRP2")),
                  x=c(1,2,3,4),
                  n=c(1,1,1,1),
                  grp=c("GRP1","GRP1","GRP2","GRP2"))

plot_ly(dat) %>%
  add_markers(x = ~x, 
              y = ~y, color = ~grp, 
              marker = list(size=~I(n*10)),
              opacity = .7) %>%
  layout(showlegend=F)

dat2 <- data.frame(y=factor(c(1,1,2,2),levels=c(1,2),labels=c("GRP1","GRP2")),
                   x=c(1,2,3,4),
                   n=c(1,2,1,1),
                   grp=c("GRP1","GRP1","GRP2","GRP2"))

plot_ly(dat2) %>%
  add_markers(x = ~x, 
              y = ~y,  color = ~grp, 
              marker = list(size=~I(n*10)),
              opacity = .7) %>%
  layout(showlegend=F)

【讨论】:

以上是关于使用数据列设置标记像素大小的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 图形像素侧位置?

Qt与Qtablewidget中headeritem的Python大小

HTML:将表格中的两列设置为比其他列宽固定像素数

表单“X”标记识别

具有基于像素的标记灰度图像数据。有没有建议训练这些数据进行分类?

小册子R中的可变标记尺寸特征