- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小部件表;每个小部件都有唯一的 ID、颜色和类别。我想在 ggraph
中制作此表的 circlepack
图,该图在类别上分面,层次结构类别 > 颜色 > 小部件 ID:
问题是根节点。在此 MWE 中,根节点没有类别,因此它有自己的分面。
library(igraph)
library(ggraph)
# Toy dataset. Each widget has a unique ID, a fill color, a category, and a
# count. Most widgets are blue.
widgets.df = data.frame(
id = seq(1:200),
fill.hex = sample(c("#0055BF", "#237841", "#81007B"), 200, replace = T,
prob = c(0.6, 0.2, 0.2)),
category = c(rep("a", 100), rep("b", 100)),
num.widgets = ceiling(rexp(200, 0.3)),
stringsAsFactors = F
)
# Edges of the graph.
widget.edges = bind_rows(
# One edge from each color/category to each related widget.
widgets.df %>%
mutate(from = paste(fill.hex, category, sep = ""),
to = paste(id, fill.hex, category, sep = "")) %>%
select(from, to) %>%
distinct(),
# One edge from each category to each related color.
widgets.df %>%
mutate(from = category,
to = paste(fill.hex, category, sep = "")) %>%
select(from, to) %>%
distinct(),
# One edge from the root node to each category.
widgets.df %>%
mutate(from = "root",
to = category)
)
# Vertices of the graph.
widget.vertices = bind_rows(
# One vertex for each widget.
widgets.df %>%
mutate(name = paste(id, fill.hex, category, sep = ""),
fill.to.plot = fill.hex,
color.to.plot = "#000000") %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One vertex for each color/category.
widgets.df %>%
mutate(name = paste(fill.hex, category, sep = ""),
fill.to.plot = "#FFFFFF",
color.to.plot = "#000000",
num.widgets = 1) %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One vertex for each category.
widgets.df %>%
mutate(name = category,
fill.to.plot = "#FFFFFF",
color.to.plot = "#000000",
num.widgets = 1) %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One root vertex.
data.frame(name = "root",
category = "",
fill.to.plot = "#FFFFFF",
color.to.plot = "#BBBBBB",
num.widgets = 1,
stringsAsFactors = F)
)
# Make the graph.
widget.igraph = graph_from_data_frame(widget.edges, vertices = widget.vertices)
widget.ggraph = ggraph(widget.igraph,
layout = "circlepack", weight = "num.widgets") +
geom_node_circle(aes(fill = fill.to.plot, color = color.to.plot)) +
scale_fill_manual(values = sort(unique(widget.vertices$fill.to.plot))) +
scale_color_manual(values = sort(unique(widget.vertices$color.to.plot))) +
theme_void() +
guides(fill = F, color = F, size = F) +
theme(aspect.ratio = 1) +
facet_nodes(~ category, scales = "free")
widget.ggraph
如果我完全省略根节点,ggraph
会发出警告,指出该图有多个组件并仅绘制第一个类别。
如果我将根节点分配给第一个类别,第一个类别的图就会缩小(因为整个根节点也被绘制出来,而 scales="free"
显示所有其他类别)。
我还尝试将 filter = !is.na(category)
添加到 geom_node_circle
的 aes
和 drop = T
到 facet_nodes
,但这似乎没有任何效果。
作为最后的手段,我可以保留根节点的分面但使其完全空白(将类别名称设为空字符串,将圆圈颜色更改为白色)。如果根节点面总是在最后,那么那里的无关紧要的东西就不那么明显了。但我很想找到更好的解决方案。
我愿意使用 ggraph
以外的东西,但我有以下技术限制:
我需要用小部件的实际颜色填充每个小部件的圆圈。我相信这排除了 circlepackeR
。
我需要在每个图表中设置两个级别(颜色和小部件 ID);我相信这排除了 packcircles
+ ggiraph
,如 here 所述.
这些图表是我正在使用的 Shiny 应用程序的一部分 this solution添加工具提示(每个小部件的 ID;这必须是工具提示而不是标签,因为在真实数据集中,圆圈很小而 ID 很长)。我认为这与为每个类别制作单独的图表并使用 grid.arrange
绘制它们是不相容的。我没用过d3
,不知道this approach是不是可以修改以适应分面和工具提示。
编辑:另一个包含 Shiny 部分的 MWE:
library(dplyr)
library(shiny)
library(igraph)
library(ggraph)
# Toy dataset. Each widget has a unique ID, a fill color, a category, and a
# count. Most widgets are blue.
widgets.df = data.frame(
id = seq(1:200),
fill.hex = sample(c("#0055BF", "#237841", "#81007B"), 200, replace = T,
prob = c(0.6, 0.2, 0.2)),
category = c(rep("a", 100), rep("b", 100)),
num.widgets = ceiling(rexp(200, 0.3)),
stringsAsFactors = F
)
# Edges of the graph.
widget.edges = bind_rows(
# One edge from each color/category to each related widget.
widgets.df %>%
mutate(from = paste(fill.hex, category, sep = ""),
to = paste(id, fill.hex, category, sep = "")) %>%
select(from, to) %>%
distinct(),
# One edge from each category to each related color.
widgets.df %>%
mutate(from = category,
to = paste(fill.hex, category, sep = "")) %>%
select(from, to) %>%
distinct(),
# One edge from the root node to each category.
widgets.df %>%
mutate(from = "root",
to = category)
)
# Vertices of the graph.
widget.vertices = bind_rows(
# One vertex for each widget.
widgets.df %>%
mutate(name = paste(id, fill.hex, category, sep = ""),
fill.to.plot = fill.hex,
color.to.plot = "#000000") %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One vertex for each color/category.
widgets.df %>%
mutate(name = paste(fill.hex, category, sep = ""),
fill.to.plot = "#FFFFFF",
color.to.plot = "#000000",
num.widgets = 1) %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One vertex for each category.
widgets.df %>%
mutate(name = category,
fill.to.plot = "#FFFFFF",
color.to.plot = "#000000",
num.widgets = 1) %>%
select(name, category, fill.to.plot, color.to.plot, num.widgets) %>%
distinct(),
# One root vertex.
data.frame(name = "root",
fill.to.plot = "#FFFFFF",
color.to.plot = "#BBBBBB",
num.widgets = 1,
stringsAsFactors = F)
)
# UI logic.
ui <- fluidPage(
# Application title
titlePanel("Widget Data"),
# Make sure the cursor has the default shape, even when using tooltips
tags$head(tags$style(HTML("#widgetPlot { cursor: default; }"))),
# Main panel for plot.
mainPanel(
# Circle-packing plot.
div(
style = "position:relative",
plotOutput(
"widgetPlot",
width = "700px",
height = "400px",
hover = hoverOpts("widget_plot_hover", delay = 20, delayType = "debounce")
),
uiOutput("widgetHover")
)
)
)
# Server logic.
server <- function(input, output) {
# Create the graph.
widget.ggraph = reactive({
widget.igraph = graph_from_data_frame(widget.edges, vertices = widget.vertices)
widget.ggraph = ggraph(widget.igraph,
layout = "circlepack", weight = "num.widgets") +
geom_node_circle(aes(fill = fill.to.plot, color = color.to.plot)) +
scale_fill_manual(values = sort(unique(widget.vertices$fill.to.plot))) +
scale_color_manual(values = sort(unique(widget.vertices$color.to.plot))) +
theme_void() +
guides(fill = F, color = F, size = F) +
theme(aspect.ratio = 1) +
facet_nodes(~ category, scales = "free")
widget.ggraph
})
# Render the graph.
output$widgetPlot = renderPlot({
widget.ggraph()
})
# Tooltip for the widget graph.
# https://gitlab.com/snippets/16220
output$widgetHover = renderUI({
# Get the hover options.
hover = input$widget_plot_hover
# Find the data point that corresponds to the circle the mouse is hovering
# over.
if(!is.null(hover)) {
point = widget.ggraph()$data %>%
filter(leaf) %>%
filter(r >= (((x - hover$x) ^ 2) + ((y - hover$y) ^ 2)) ^ .5)
} else {
return(NULL)
}
if(nrow(point) != 1) {
return(NULL)
}
# Calculate how far from the left and top the center of the circle is, as a
# percent of the total graph size.
left_pct = (point$x - hover$domain$left) / (hover$domain$right - hover$domain$left)
top_pct <- (hover$domain$top - point$y) / (hover$domain$top - hover$domain$bottom)
# Convert the percents into pixels.
left_px <- hover$range$left + left_pct * (hover$range$right - hover$range$left)
top_px <- hover$range$top + top_pct * (hover$range$bottom - hover$range$top)
# Set the style of the tooltip.
style = paste0("position:absolute; z-index:100; background-color: rgba(245, 245, 245, 0.85); ",
"left:", left_px, "px; top:", top_px, "px;")
# Create the actual tooltip as a wellPanel.
wellPanel(
style = style,
p(HTML(paste("Widget id and color:", point$name)))
)
})
}
# Run the application
shinyApp(ui = ui, server = server)
最佳答案
这是一种解决方案,但可能不是最好的解决方案。让我们开始吧
gb <- ggplot_build(widget.ggraph)
gb$layout$layout <- gb$layout$layout[-1, ]
gb$layout$layout$COL <- gb$layout$layout$COL - 1
我们以这种方式删除了第一个方面。但是,我们还需要修复gb
里面的数据。特别是,我们使用
library(scales)
gb$data[[1]] <- within(gb$data[[1]], {
x[PANEL == 3] <- rescale(x[PANEL == 3], to = range(x[PANEL == 2]))
x[PANEL == 2] <- rescale(x[PANEL == 2], to = range(x[PANEL == 1]))
y[PANEL == 3] <- rescale(y[PANEL == 3], to = range(y[PANEL == 2]))
y[PANEL == 2] <- rescale(y[PANEL == 2], to = range(y[PANEL == 1]))
})
将面板 3 和面板 2 中的 x
和 y
分别重新调整为面板 2 和 1 中的那些。最后,
gb$data[[1]] <- gb$data[[1]][gb$data[[1]]$PANEL %in% 2:3, ]
gb$data[[1]]$PANEL <- factor(as.numeric(as.character(gb$data[[1]]$PANEL)) - 1)
删除第一个面板并相应地更改面板名称。这给了
library(grid)
grid.draw(ggplot_gtable(gb))
关于r - 使用 circlepack 在 ggraph 中分面时隐藏根节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165414/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!