gpt4 book ai didi

python - ggplot2:绘制安德鲁斯曲线

转载 作者:行者123 更新时间:2023-12-05 02:33:52 25 4
gpt4 key购买 nike

我正在尝试通过实践来了解 Andrews plots。我知道 R 有使用基本绘图系统的 andrews 包,但我想使用 ggplot2。我关注了andrews_curves pandas 库中的函数实现。

我已经设法翻译了 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)。我只想复制 this plot通过使用相同的数据,但我得到了一些非常不对劲的东西:

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 package 创建于 2022-01-26 (v2.0.1)

最佳答案

下面的代码似乎可以满足您的需求,而且从肉眼看来,与您链接到的维基百科页面上的情节相匹配。

唯一尴尬的部分是为 -pi 和 pi 之间的每个 T 值复制 iris 数据框的每一行。传递给 uncount() 的值与向量 t 的长度相同很重要。

我已将每行的 Andrews 分数公式中的列顺序作为它们在 iris 数据框中出现的顺序。我不知道改变列的顺序会有什么影响。

library(tidyverse)

t=seq(-pi, pi, length.out=100)
root2 <- sqrt(2)
as_tibble(iris) %>%
mutate(Row=row_number(), .before=1) %>%
uncount(100) %>%
add_column(T=rep(t, times=nrow(iris))) %>%
mutate(Andrews=Sepal.Length/root2 + Sepal.Width*sin(t) + Petal.Length*cos(t) + Petal.Width*sin(2*t)) %>%
ggplot() +
geom_line(aes(x=T, y=Andrews, group=Row, colour=Species))

给予

enter image description here

group=Row 在图中为数据框的每一行生成一条线。 colour=Species 根据 Species 的相应值为每行着色。

[可能有一种比 uncount() %>% add_column() 更简洁的方法来为 t 的每个值复制 iris 的每一行> 使用 expand(),但我无法让它工作。]

关于python - ggplot2:绘制安德鲁斯曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70862871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com