如何用 R 中的值可视化 data.tree?

Posted

技术标签:

【中文标题】如何用 R 中的值可视化 data.tree?【英文标题】:How do I visualize a data.tree with values in R? 【发布时间】:2020-06-18 21:24:21 【问题描述】:

如标题中所述,如何绘制具有相关值的 data.tree?

提前感谢您的帮助。已经不知所措了:(

编辑:更多信息:

我试图可视化的数据是一项调查,受访者被问到主要问题,如果他/她回答是,那么第一个问题就会有后续问题。我试图可视化对每个问题回答是或否的受访者百分比,我的想法是使用类似情节的决策树。

library(data.tree)
library(networkD3)

# create simple tree
tree <- Node$new("Primary Node")
tree1 <- tree$AddChild("Tree1")
tree2 <- tree$AddChild("Tree2")
tree3 <- tree1$AddChild("Tree3")
tree4 <- tree2$AddChild("Tree4")

# assign value

tree1$value <- 1
tree2$value <- 2
tree3$value <- 3
tree4$value <- 4

# plot tree ## No values reflected
plot(tree)
simpleNetwork(ToDataFrameNetwork(tree))

编辑:

Gilean 尝试了您的解决方案,效果很好,但是,如何让子节点将相同的单词识别为不同的树?以及如何通过字体大小或对齐方式调整单词,使其不会妨碍可视化?

library(igraph)

# requires the changing of No to No1, No2 and so forth to prevent it merging into one large node

df <- data.frame(parent = c("Have you ever had your cholesterol  fat levels in your blood  measured by a doctor or other health worker",
                            "Have you ever had your cholesterol  fat levels in your blood  measured by a doctor or other health worker",
                            "Have you ever been told by a doctor or other health worker that you have raised cholesterol",
                            "Have you ever been told by a doctor or other health worker that you have raised cholesterol",
                            "Were you first told in the past 12 months",
                            "Were you first told in the past 12 months",
                            "In the past two weeks have you taken any oral treatment medication for raised total cholesterol prescribed by a doctor or other health worker",
                            "In the past two weeks have you taken any oral treatment medication for raised total cholesterol prescribed by a doctor or other health worker",
                            "Have you ever seen a traditional healer for raised cholesterol",
                            "Have you ever seen a traditional healer for raised cholesterol",
                            "Are you currently taking any herbal or traditional remedy for your raised cholesterol",
                            "Are you currently taking any herbal or traditional remedy for your raised cholesterol"),

                          child = c("No", "Have you ever been told by a doctor or other health worker that you have raised cholesterol", 
                           "No1", "Were you first told in the past 12 months",
                           "No2", "In the past two weeks have you taken any oral treatment medication for raised total cholesterol prescribed by a doctor or other health worker",
                           "No3", "Have you ever seen a traditional healer for raised cholesterol",
                           "No4", "Are you currently taking any herbal or traditional remedy for your raised cholesterol",
                           "No5", "Yes"),

                 value = 1:12)


tree <- graph_from_data_frame(df, directed = TRUE)

plot(tree, vertex.label = V(tree)$name, edge.label = E(tree)$value, layout=layout_as_tree, vertex.size = c(10, E(tree)$value))

【问题讨论】:

data.tree 是必需的还是像igraph 这样的其他软件包也可以? 请。我使用 data.tree 只是因为它是谷歌弹出的第一个选项。 如果您在控制台中输入?igraph.plotting,您可以看到您可以在绘图中调整的所有参数。对于字体大小,您要使用vertex.label.cex,对于对齐,请使用vertex.label.distvertex.label.angle 的组合。对于你的其他问题。现在,第二个示例中的节点标签和节点名称相同。如果您创建具有唯一节点名称的 data.frame,则可以在之后使用 vertex.label 分配非唯一节点标签。 将来最好将进一步的问题作为一个单独的问题提出,而不是编辑您的原始问题,这样更多的用户可以帮助您,而其他用户可以在他们寻找特定问题时找到您的问题. 【参考方案1】:

我对@9​​87654321@不是很熟悉,所以不知道添加所有标签的快速方法,但是你可以为每条边分别设置一个标签。

library(data.tree)

# create simple tree
tree <- Node$new("Primary Node")
tree1 <- tree$AddChild("Tree1")
tree2 <- tree$AddChild("Tree2")
tree3 <- tree1$AddChild("Tree3")
tree4 <- tree2$AddChild("Tree4")

# add edges 
SetEdgeStyle(tree, label = 1)
SetEdgeStyle(tree2, label = 2)
SetEdgeStyle(tree3, label = 3)
SetEdgeStyle(tree4, label = 4)

# plot tree 
plot(tree)

igraph 中,您只需使用所需的所有信息创建一个data.frame,并从此data.frame 中创建一个带有边缘标签的树结构图。但是,与data.tree 相比,需要进行更多调整以使其看起来更好。

library(igraph)
df <- data.frame(parent = c("Primary Node", "Primary Node", "Tree1", "Tree2"),
                 child = c("Tree1", "Tree2", "Tree3", "Tree4"),
                 value = 1:4)

tree <- graph_from_data_frame(df, directed = TRUE)

plot(tree, vertex.label = V(tree)$name, edge.label = E(tree)$value, layout=layout_as_tree, vertex.size = c(20, E(tree)$value * 10))

【讨论】:

哦,这很好,谢谢。有什么方法可以根据值动态调整树节点的大小?例如树 1 值 1 = 最小节点,而树 4 值 4 = 最大节点。 我在igraph-解决方案中添加了参数vertex.size,以根据值更改节点大小。 嗨@Gilean0709,尝试了你的解决方案,效果很好,只是需要一些小的改进。将代码发布在原始评论中。感谢您的帮助。

以上是关于如何用 R 中的值可视化 data.tree?的主要内容,如果未能解决你的问题,请参考以下文章

R与数据可视化系列如何使用dplyr进行数据清洗和变换

如何用C语言编程出可视化界面?

从《觉醒年代》看如何用Python来绘制可视化仪表盘

如何用matlab可视化二进制文件,如图像?

如何用python实现数据可视化?

数据故事使用ggplot2进行数据可视化