具有百分比直方图和彩色类别的图链接子图

问题描述 投票:0回答:1

背景

我正在R中使用plotly API创建两个链接图。第一个是散点图,第二个是条形图,应显示当前选择中属于每个类别的数据的百分比。我无法使百分比表现出预期的效果。

问题

图可以正确渲染,并且交互式选择效果很好。当我在顶部散点图中选择一组数据点时,我想查看属于每个类别的选择的百分比。相反,我看到的是该类别中该类别中选择项中属于该类别的点的百分比,换句话说,始终是100%。我猜这是因为我设置了color = ~c,将分组应用于类别。

示例

以下是可复制的示例。首先创建一些虚拟数据。

library(plotly)

n = 1000
make_axis = function(n) c(rnorm(n, -1, 1), rnorm(n, 2, 0.25))
data = data.frame(
  x = make_axis(n),
  y = make_axis(n),
  c = rep(c("A", "B"), each = n)
)

创建sharedData对象并将其提供给plot_ly()作为基础图。

shared_data = data %>% 
  highlight_key()

baseplot = plot_ly(shared_data)

制作各个面板。

points = baseplot %>% 
  add_markers(x = ~x, y = ~y, color = ~c)

bars = baseplot %>% 
  add_histogram(x = ~c, color = ~c, histnorm = "percent", showlegend = FALSE) %>% 
  layout(barmode = "group")

并将它们放在一起并带有选择和突出显示的链接子图中。

subplot(points, bars) %>% 
  layout(dragmode = "select") %>% 
  highlight("plotly_selected") 

这里是此问题的屏幕截图,用于说明问题。enter image description here

一旁

偶然地,当我在histnorm = ""中设置add_histogram()时,我会更接近预期的行为,但我确实希望百分比而不是计数。当我删除color = ~c时,我会更接近预期的行为,但我确实想要一致的配色方案。

我尝试了什么

我尝试手动提供颜色,但随后某些链接的选择中断。我尝试过先从sharedData对象创建一个单独的汇总数据集,然后对其进行绘图,但这再次破坏了绘图之间的联系。

如果有人对如何解决这个问题有任何线索,我将非常感激。

r plotly visualization r-plotly
1个回答
1
投票

对我来说,您寻找的行为似乎并未以情节实现。

请参阅schema():对象►迹线►直方图►属性►histnorm►说明

但是,这是我能够通过add_bars获得并处理数据的最接近的数据(很抱歉添加data.table,您将能够在基数R中执行相同的操作,只是个人喜好):

library(plotly)
library(data.table)

n = 1000
make_axis = function(n) c(rnorm(n, -1, 1), rnorm(n, 2, 0.25))
DT = data.table(
  x = make_axis(n),
  y = make_axis(n),
  c = rep(c("A", "B"), each = n)
)

DT[, grp_percent := rep(100/.N, .N), by = "c"]

shared_data = DT %>% 
  highlight_key()

baseplot = plot_ly(shared_data)
# Make the individual panels.

points = baseplot %>% 
  add_markers(x = ~x, y = ~y, color = ~c)

bars = baseplot %>% 
  add_bars(x = ~c, y = ~grp_percent, color = ~c, showlegend = FALSE) %>% 
  layout(barmode = "group")

subplot(points, bars) %>% 
  layout(dragmode = "select") %>% 
  highlight("plotly_selected")

Result

不幸的是,生成的hoverinfo并不是很理想。

© www.soinside.com 2019 - 2024. All rights reserved.