gpt4 book ai didi

r - 如何绘制每条线之间具有特定距离的图形

转载 作者:行者123 更新时间:2023-12-03 16:53:54 25 4
gpt4 key购买 nike

实际上,我尝试绘制一个图形,但它会将所有列(行)相互放置并显示出来,因此它不具有代表性。我尝试制作模拟数据并向您展示我如何绘制它,并向您展示我想要的

我不知道如何制作像我在下面展示的示例那样的数据,但我在这里做什么

set.seed(1)
M <- matrix(rnorm(20),20,5)
x <- as.matrix(sort(runif(20, 5.0, 7.5)))
df <- as.data.frame(cbind(x,M))

制作数据框后,我将通过融化它并使用 ggplot 绘制所有列与第一列
require(ggplot2)
require(reshape)
dff <- melt(df , id.vars = 'V1')
b <- ggplot(dff, aes(V1,value)) + geom_line(aes(colour = variable))

我希望每条线之间有特定的距离(在这种情况下我们有 6 条),如下所示。在一个维度上它是 V1,在另一个维度上它是列数。我不在乎功能,我只想要照片

最佳答案

此解决方案使用 rgl 并产生这个情节:

enter image description here

它使用这个接受 3 个参数的函数:

  • df :data.frame就像你上面的“M”
  • x :numeric vector (or a 1-col data.frame`) 用于 x 轴
  • cols :(可选)要重复的颜色向量。如果丢失,则绘制黑线

  • 这是函数:
    nik_plot <- function(df, x, cols){
    require(rgl)
    # if a data.frame is
    if (is.data.frame(x) && ncol(x)==1)
    x <- as.numeric(x[, 1])
    # prepare a vector of colors
    if (missing(cols))
    cols <- rep_len("#000000", nrow(df))
    else
    cols <- rep_len(cols, nrow(df))
    # initialize an empty 3D plot
    plot3d(NA, xlim=range(x), ylim=c(1, ncol(df)-1), zlim=range(df), xlab="Mass/Charge (M/Z)", ylab="Time", zlab="Ion Spectra", box=FALSE)
    # draw lines, silently
    silence_please <- sapply(1:ncol(df), function(i) lines3d(x=x, y=i, z=df[, i], col=cols[i]))
    }

    请注意,您可以删除 require(rgl)从函数和 library(rgl)在您的脚本中的某个地方,例如在开头。

    如果您没有 rgl安装,然后 install.packages("rgl") .

    默认情况下,黑色线条可能会产生一些摩尔纹效果,但重复的调色板会更糟。这可能取决于大脑。单一颜色还可以避免引入人工维度(和强烈的维度)。

    下面是一个例子:
    # black lines
    nik_plot(M, x)
    # as in the image above
    nik_plot(M, x, "grey40")
    # an unreadable rainbow
    nik_plot(M, x, rainbow(12))

    可以使用鼠标导航 3D 窗口。

    你需要别的东西吗?

    编辑

    您可以使用以下函数构建第二个图。您的数据范围如此之大,我认为每条线向上移动背后的整个想法都会阻止使用具有可靠比例的 y 轴。在这里,我对所有信号进行了标准化(0 <= 信号 <= 1)。还有参数 gap可以用来玩这个。我们可以断开这两种行为,但我认为这很好。尝试不同的 gap 值并查看下面的示例。
  • df :data.frame就像你上面的“M”
  • x :numeric vector (or a 1-col data.frame`) 用于 x 轴
  • cols :(可选)要重复的颜色向量。如果丢失,则绘制黑线
  • gap : 各行之间的间隙系数
  • more_gap_each : 每 n 行,产生一个更大的间隙...
  • more_gap_relative : ... 将是 gap x more_gap_relative

  • 这是函数:
    nik_plot2D <- function(df, x, cols, gap=10, more_gap_each=1, more_gap_relative=0){
    if (is.data.frame(x) && ncol(x)==1)
    x <- as.numeric(x[, 1])

    # we normalize ( 0 <= signal <= 1)
    df <- df-min(df)
    df <- (df/max(df))
    # we prepare a vector of colors
    if (missing(cols))
    cols <- rep_len("#00000055", nrow(df))
    else
    cols <- rep_len(cols, nrow(df))
    # we prepare gap handling. there is probably more elegant
    gaps <- 1
    for (i in 2:ncol(df))
    gaps[i] <- gaps[i - 1] + 1/gap + ifelse((i %% more_gap_each) == 0, (1/gap)*more_gap_relative, 0)
    # we initialize the plot
    plot(NA, xlim=range(x), ylim=c(min(df), 1+max(gaps)), xlab="Time", ylab="", axes=FALSE, mar=rep(0, 4))
    axis(1)
    # finally, the lines
    silent <- lapply(1:ncol(df), function(i) lines(x, df[, i] + gaps[i], col=cols[i]))
    }

    我们可以将它与(默认)一起使用:
    nik_plot2D(M, x) # gap=10

    你得到这个情节:

    enter image description here

    或者:
    nik_plot2D(M, x, 50)

    enter image description here

    或者,使用颜色:
    nik_plot2D(M, x, gap=20, cols=1:3)
    nik_plot2D(M, x, gap=20, cols=rep(1:3, each=5))

    或者,仍然有颜色但有更大的差距:
    nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 1, more_gap_relative = 0) # no gap by default
    nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 10, more_gap_relative = 4) # large gaps every 10 lines
    nik_plot2D(M, x, gap=20, cols=terrain.colors(10), more_gap_each = 5, more_gap_relative = 2) # small gaps every 5 lines

    enter image description here

    关于r - 如何绘制每条线之间具有特定距离的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36448950/

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