我正在尝试通过实践学习Andrews图。 我知道R有andrews
包使用基本绘图系统,但我想使用ggplot2
。我按照pandas
库中andrews_curves
函数实现的步骤进行了转换。
我已经成功地翻译了Python函数的数据转换步骤:
andrews <- function(df, class_column, samples=200) {
t <- seq(-pi, pi, length.out = samples)
vals <- t(
data.matrix(
df[, -which(names(df) %in% class_column)]
)
)
curves <- outer(vals[1, ], rep(1, length(t)))
for (i in 2:nrow(vals)) {
ft = (i %/% 2) * t
if (i %% 2 == 0) {
curves <- curves + outer(vals[i, ], sin(ft))
} else {
curves <- curves + outer(vals[i, ], cos(ft))
}
}
df_out <- data.frame(
t = rep(seq_len(samples), nrow(curves)),
sample = rep(seq_len(nrow(curves)), ncol(curves)),
values = as.vector(t(curves)),
class_column = rep(df[, class_column], samples)
)
df_out
}
很遗憾,我是Python的初学者,不理解绘图系统(在andrews_curves
中的60-69)。 我只想使用相同的数据复制这个图表,但得到的结果却十分偏差:
iris <- read.csv('https://raw.github.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/iris.csv')
adrews_data <- andrews(iris, "Name", 30)
library(ggplot2)
ggplot(adrews_data, aes(x = t, y = values, color = class_column, group = interaction(class_column, sample))) +
geom_line(size = 1.2)
此代码示例由 reprex包(v2.0.1)于2022-01-26创建