mal*_*atr 9 r data-visualization ggplot2 parallel-coordinates
有谁知道是否有办法ggparcoord在GGally中为函数添加变量标签?我尝试了很多方法geom_text,但没有任何结果.
为了更明确,我希望row.names(mtcars)通过geom_text.我可以区分汽车的唯一方法是row.names(mtcars)通过groupColumn论证,但我不喜欢这种看法.
不起作用:
mtcars$carName <- row.names(mtcars) # This becomes column 12
library(GGally)
# Attempt 1
ggparcoord(mtcars,
columns = c(12, 1, 6),
groupColumn = 1) +
geom_text(aes(label = carName))
# Attempt 2
ggparcoord(mtcars,
columns = c(12, 1, 6),
groupColumn = 1,
mapping = aes(label = carName))
Run Code Online (Sandbox Code Playgroud)
任何想法,将不胜感激!
解决方案 1:如果您想坚持最初的尝试,您可以计算汽车名称的适当 y 坐标,并将其添加为单独的数据源。使用inherit.aes = FALSE此 geom_text 图层不会从使用以下命令创建的 ggplot 对象继承任何内容ggparcoord():
library(dplyr)
p1 <- ggparcoord(mtcars,
columns = c(12, 1, 6),
groupColumn = 1) +
geom_text(data = mtcars %>%
select(carName) %>%
mutate(x = 1,
y = scale(as.integer(factor(carName)))),
aes(x = x, y = y, label = carName),
hjust = 1.1,
inherit.aes = FALSE) +
# optional: remove "carName" from x-axis labels
scale_x_discrete(labels = function(x) c("", x[-1])) +
# also optional: hide legend, which doesn't really seem relevant here
theme(legend.position = "none")
p1
Run Code Online (Sandbox Code Playgroud)
解决方案 2:此替代方案使用 carName 作为组列,并且不将其作为并行坐标列之一传递。data(我认为这可能更接近此函数预期的用例...)指定 carName 作为组列允许在此时创建的 ggplot 对象的槽中捕获汽车名称值ggparcoord(),因此我们的geom_text标签可以直接继承它,甚至仅过滤对应的行variable == "mpg"(或者在实际用例中命名的第一个平行坐标列)。y 坐标不像上面那样均匀分布,但是geom_text_repelggrepel 包在将重叠的文本标签相互移开方面做得很好。
library(dplyr)
library(ggrepel)
p2 <- ggparcoord(mtcars,
columns = c(1, 6),
groupColumn = "carName") +
geom_text_repel(data = . %>%
filter(variable == "mpg"),
aes(x = variable, y = value, label = carName),
xlim = c(NA, 1)) + # limit repel region to the left of the 1st column
theme(legend.position = "none") # as before, hide legend since the labels
# are already in the plot
p2
Run Code Online (Sandbox Code Playgroud)
解决方案 3 / 4:您实际上可以使用 绘制相同的图ggplot(),而无需依赖可能在幕后执行意外操作的扩展:
library(dplyr)
library(tidyr)
library(ggrepel)
# similar output to solution 1
p3 <- mtcars %>%
select(carName, mpg, wt) %>%
mutate(carName.column = as.integer(factor(carName))) %>%
gather(variable, value, -carName) %>%
group_by(variable) %>%
mutate(value = scale(value)) %>%
ungroup() %>%
ggplot(aes(x = variable, y = value, label = carName, group = carName)) +
geom_line() +
geom_text(data = . %>% filter(variable == "carName.column"),
hjust = 1.1) +
scale_x_discrete(labels = function(x) c("", x[-1]))
p3
# similar output to solution 2
p4 <- mtcars %>%
select(carName, mpg, wt) %>%
gather(variable, value, -carName) %>%
group_by(variable) %>%
mutate(value = scale(value)) %>%
ungroup() %>%
ggplot(aes(x = variable, y = value, label = carName, group = carName)) +
geom_line() +
geom_text_repel(data = . %>% filter(variable == "mpg"),
xlim = c(NA, 1))
p4
Run Code Online (Sandbox Code Playgroud)
编辑
您还可以为上述每个内容在右侧添加文本标签。请注意,标签的位置可能不会很好地间隔开,因为它们是根据 的wt缩放值定位的:
p1 +
geom_text(data = mtcars %>%
select(carName, wt) %>%
mutate(x = 3,
y = scale(wt)),
aes(x = x, y = y, label = carName),
hjust = -0.1,
inherit.aes = FALSE)
p2 +
geom_text_repel(data = . %>%
filter(variable == "wt"),
aes(x = variable, y = value, label = carName),
xlim = c(2, NA))
p3 +
geom_text(data = . %>% filter(variable == "wt"),
hjust = -0.1)
p4 +
geom_text_repel(data = . %>% filter(variable == "wt"),
xlim = c(2, NA))
Run Code Online (Sandbox Code Playgroud)