R:可视化 "Linked" 数据
R: Visualizing "Linked" Data
我正在使用 R 并正在尝试重新创建类似这张图片的内容:
我做了一些研究,发现 R 中的“ggforce”库 (https://ggforce.data-imaginist.com/reference/geom_parallel_sets.html) 允许用户制作类似样式的图(使用“名字”、“中间名”和“的图” last name”——这些图表明“first name”确实很常见,“first name and the middle name”不太常见,“first name, middle name and last name”不太常见):
library(ggforce)
library(reshape2)
name_data <- data.frame(
"First_Name" = c("John", "John", "John", "John", "John", "John", "James", "James", "Adam", "Adam", "Henry"),
"Middle_Name" = c("Claude", "Claude", "Claude", "Smith", "Smith", "Peters", "Stevens", "Stevens", "Ford", "Tom", "Frank"),
"Last Name " = c("Tony", "Tony", "Frank", "Carson", "Phil", "Lewis", "Eric", "David", "Roberts", "Scott", "Xavier")
)
name_data$ID <- seq.int(nrow(name_data))
data <- reshape2::melt(name_data)
data <- gather_set_data(name_data)
ggplot(name_data, aes( id = value, split = First_Name, value = value)) +
geom_parallel_sets(aes( alpha = 0.3, axis.width = 0.1) +
geom_parallel_sets_axes(axis.width = 0.1) +
geom_parallel_sets_labels(colour = 'white'))
但是这个returns出现如下错误:
Error in FUN(X[[i]], ...) : object 'x' not found
有人可以告诉我我做错了什么吗?
谢谢
ggplot aes函数的第一个参数是x轴变量。在您提供的示例中,那是 x=survived
(可能在示例的前面设置)。您需要指定一个 x 轴变量,在本例中可能是 x=City
?即尝试:
ggplot(name_data, aes(x=City, id=ID, ...
编辑:
好的,看起来您首先需要计算不同的名称组合(这已经作为值列存在于泰坦尼克号数据示例中)。您可以使用 aggregate
函数执行此操作:
name_counts=aggregate(name_data$ID,
by=list(First_Name=name_data$First_Name,
Middle_Name=name_data$Middle_Name,
Last_Name=name_data$Last.Name.),
FUN=length)
names(name_counts)[4] = 'value'
这给出了每个名字、中间名和姓氏组合的计数。此时,运行gather_set_data
函数:
name_counts_gathered = gather_set_data(name_counts, 1:3)
现在,您可以使用 ggplot
和 geom_parallel_sets
绘图:
ggplot(name_counts_gathered) +
geom_parallel_sets(aes(x=x,id=id,split=y,value=value))
gather_set_data
函数根据绘图函数的要求添加了 id、x 和 y 列。
我不完全确定您希望绘图看起来如何,但希望您现在可以尝试使用绘图标签和选项。
我正在使用 R 并正在尝试重新创建类似这张图片的内容:
我做了一些研究,发现 R 中的“ggforce”库 (https://ggforce.data-imaginist.com/reference/geom_parallel_sets.html) 允许用户制作类似样式的图(使用“名字”、“中间名”和“的图” last name”——这些图表明“first name”确实很常见,“first name and the middle name”不太常见,“first name, middle name and last name”不太常见):
library(ggforce)
library(reshape2)
name_data <- data.frame(
"First_Name" = c("John", "John", "John", "John", "John", "John", "James", "James", "Adam", "Adam", "Henry"),
"Middle_Name" = c("Claude", "Claude", "Claude", "Smith", "Smith", "Peters", "Stevens", "Stevens", "Ford", "Tom", "Frank"),
"Last Name " = c("Tony", "Tony", "Frank", "Carson", "Phil", "Lewis", "Eric", "David", "Roberts", "Scott", "Xavier")
)
name_data$ID <- seq.int(nrow(name_data))
data <- reshape2::melt(name_data)
data <- gather_set_data(name_data)
ggplot(name_data, aes( id = value, split = First_Name, value = value)) +
geom_parallel_sets(aes( alpha = 0.3, axis.width = 0.1) +
geom_parallel_sets_axes(axis.width = 0.1) +
geom_parallel_sets_labels(colour = 'white'))
但是这个returns出现如下错误:
Error in FUN(X[[i]], ...) : object 'x' not found
有人可以告诉我我做错了什么吗?
谢谢
ggplot aes函数的第一个参数是x轴变量。在您提供的示例中,那是 x=survived
(可能在示例的前面设置)。您需要指定一个 x 轴变量,在本例中可能是 x=City
?即尝试:
ggplot(name_data, aes(x=City, id=ID, ...
编辑:
好的,看起来您首先需要计算不同的名称组合(这已经作为值列存在于泰坦尼克号数据示例中)。您可以使用 aggregate
函数执行此操作:
name_counts=aggregate(name_data$ID,
by=list(First_Name=name_data$First_Name,
Middle_Name=name_data$Middle_Name,
Last_Name=name_data$Last.Name.),
FUN=length)
names(name_counts)[4] = 'value'
这给出了每个名字、中间名和姓氏组合的计数。此时,运行gather_set_data
函数:
name_counts_gathered = gather_set_data(name_counts, 1:3)
现在,您可以使用 ggplot
和 geom_parallel_sets
绘图:
ggplot(name_counts_gathered) +
geom_parallel_sets(aes(x=x,id=id,split=y,value=value))
gather_set_data
函数根据绘图函数的要求添加了 id、x 和 y 列。
我不完全确定您希望绘图看起来如何,但希望您现在可以尝试使用绘图标签和选项。