【问题标题】:R: Parallel Coordinates Plot without GGallyR:没有GGally的平行坐标图
【发布时间】:2021-01-21 05:43:13
【问题描述】:

我正在使用 R 编程语言。我正在使用没有 USB 端口或互联网连接的计算机 - 我只有 R 和一些预加载的库(例如 ggplot2、reshape2、dplyr、base R)。

是否可以仅使用“ggplot2”库而不使用“ggally”来制作“平行坐标”图(例如下面)?

#load libraries (I do not have GGally)
library(GGally)

#load data (I have MASS)
data(crabs, package = "MASS")

#make 2 different parallel coordinate plots
ggparcoord(crabs)
ggparcoord(crabs, columns = 4:8, groupColumn = "sex")

谢谢

来源:https://homepage.divms.uiowa.edu/~luke/classes/STAT4580-2020/parcor.html

【问题讨论】:

  • 对我来说就像geom_line,你试过什么?
  • 现在,我正在尝试找出一种方法来格式化数据,以便我可以使用 geom_line
  • source code for ggparcoordgeom_line()之前有几个步骤,比如缩放数据和填补缺失值。应该可以复制,但需要一些努力。
  • @Noob 复制/粘贴源代码将是我尝试的第一件事。在某些时候,您需要将数据转换为长格式 - 看起来 ggparcoord 为此使用 reshape::melt。不确定您是否有该软件包可用 - 如果没有,请在 wide to long FAQ 查找其他选项。

标签: r ggplot2 plot data-visualization data-manipulation


【解决方案1】:

其实你甚至不需要ggplot!这只是标准化值的图(减去平均值除以 SD),因此您可以使用任何能够执行此操作的绘图函数来实现此逻辑。最干净和最简单的方法是在基础 R 中分步执行:

# Standardising the variables of interest
data(crabs, package = "MASS")
crabs[, 4:8] <- apply(crabs[, 4:8], 2, scale)
# This colour solution works in great generality, although RColorBrewer has better distinct schemes
mycolours <- rainbow(length(unique(crabs$sex)), end = 0.6)
# png("gally.png", 500, 400, type = "cairo", pointsize = 14)
par(mar = c(4, 4, 0.5, 0.75))
plot(NULL, NULL, xlim = c(1, 5), ylim = range(crabs[, 4:8]) + c(-0.2, 0.2),
     bty = "n", xaxt = "n", xlab = "Variable", ylab = "Standardised value")
axis(1, 1:5, labels = colnames(crabs)[4:8])
abline(v = 1:5, col = "#00000033", lwd = 2)
abline(h = seq(-2.5, 2.5, 0.5), col = "#00000022", lty = 2)
for (i in 1:nrow(crabs)) lines(as.numeric(crabs[i, 4:8]), col = mycolours[as.numeric(crabs$sex[i])])
legend("topright", c("Female", "Male"), lwd = 2, col = mycolours, bty = "n")
# dev.off()

您可以在任何可以方便地绘制多条线(如时间序列)的包中应用此逻辑(x 轴为整数值,y 轴为标准化变量线),但此解决方案没有额外的依赖项,不会变得不可用由于从 CRAN 中清除了具有 3 个功能的孤立包。

【讨论】:

  • 斯帕西巴!这个答案很完美!我有一个与您的回答有关的问题 - 我应该在新问题中发布吗?
  • 你能看看这个相关的问题吗? stackoverflow.com/questions/65851678/…谢谢
  • @Noob 你去吧。
  • 非常感谢您的帮助!一切都是那么优雅美丽!
  • 我正在这里解决这个问题:也许你有一些想法?
【解决方案2】:

在没有“GGally”的情况下,我发现与此最接近的是使用“MASS”库的内置函数:

#source: https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/parcoord.html
library(MASS)
parcoord(state.x77[, c(7, 4, 6, 2, 5, 3)])

ir <- rbind(iris3[,,1], iris3[,,2], iris3[,,3])
parcoord(log(ir)[, c(3, 4, 2, 1)], col = 1 + (0:149)%/%50)

【讨论】:

猜你喜欢
  • 2017-07-22
  • 2021-08-22
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2020-02-27
  • 2020-01-07
  • 2014-01-28
相关资源
最近更新 更多