【问题标题】:R: Make a array baseplot and color by array dim levelsR:通过数组暗淡级别制作数组底图和颜色
【发布时间】:2020-06-09 00:26:03
【问题描述】:

您好,我想知道如何为不同数组级别(暗名 1、2 和 3)的数组数据底图着色

x <- rnorm(1000); dim(x) <- c(10,10,10)

dimnames(x) = list(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"),
                   c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"),
                   c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))
plot(x, col=as.factor(dimnames(x)[[3]]))

没有给我想要的结果...

plot(x[1:100], col=as.factor(dimnames(x)[[3]]))

前 100 个数字没有给我一种颜色

我想知道如何通过 baseplot 中的维度上的不同集合为基础图着色。

【问题讨论】:

    标签: r arrays plot colors


    【解决方案1】:

    您需要取回数组索引,即数据点属于哪个子数组,并提供只要您要绘制的数据点的东西,例如:

    plotfunc = function(this_array,index_to_plot){
    array_index = 1+(index_to_plot - 1) %/% prod(dim(this_array)[1:2])
    COLS=as.factor(dimnames(this_array)[[3]])[array_index]
    plot(this_array[index_to_plot],col=COLS)
    }
    

    如果您从您提供的数组 x 中绘制 1:100,则您正在绘制第一个子数组,并且全部为黑色:

    plotfunc(x,1:100)
    

    我们可以从前 3 个子数组中的前 50 个开始尝试:

    plotfunc(x,c(1:50,101:150,201:250))
    

    【讨论】:

    • 你能告诉我为什么你把 1+(......-1) 功能放在那里吗? as.factor..... 之后的 [array_index] 要求一组因子 lvls 是否正确,就像您获取其他子集一样,但对于因子,它将占用请求的长度
    • 好的,是的,所以你的数组 (10x10) 重复了 10 次。在阵列中,它被展平。你想要的是一个告诉你它属于哪个(10x10)的函数,所以一个函数,其中数字 1-100 给出 1,101-200 给出 2 等等。我使用了 %% ,你可以看到, 1 %% 100 给出 0,而 999 %% 100 给出 9.. 将其移动 1 效果更好,因此 +1
    • 明白为什么要使用该功能。谢谢
    • 要绘图,您需要提供一个与 x 和 y 变量一样长的因子变量。所以是的,它调用与索引对应的维度名称向量,即 1 将是 A,101 将是 B 等等,并将其转换为要绘制的因子
    • 请等待答案,让我尝试自己的公式得到 1:10 给出 1 等。但是 201:210 再次给出 1。
    【解决方案2】:

    感谢您的意见

    我尝试调整函数以选择我希望颜色被接管的数组级别。但我似乎无法得到最低水平,因为它只需要超过 1:10 的因子水平,如果我进入最低数组水平(10 组),我无法弄清楚公式是否正确。

    plotfunc2 = function(this_array,index_to_plot,array_level)
    if (array_level == 1){
      plot(this_array[index_to_plot])
    } else if (array_level == 2){
      array_index = 1+(index_to_plot - 1) %/% prod(dim(this_array)[1:2])
      COLS=as.factor(dimnames(this_array)[[3]])[array_index]
      plot(this_array[index_to_plot],col=COLS)
    } else if (array_level == 3){
      array_index = 1+(index_to_plot - 1) %/% dim(this_array)[3]
      COLS=as.factor(dimnames(this_array)[[2]])[array_index]
      plot(this_array[index_to_plot],col=COLS)
    }
    

    【讨论】:

      【解决方案3】:

      我想我得到了我想要的,至少对于一个 10x10x10 的数组,我必须针对不同的数组尺寸对其进行验证。还可以通过确保 array_level 只能选择 1,2 或 3 来使其更严格。

      plotfunc2 = function(this_array,index_to_plot,array_level)
      if (array_level == 1){
        plot(this_array[index_to_plot])
      } else if (array_level == 2){
        array_index = 1+(index_to_plot - 1) %/% prod(dim(this_array)[1:2])
        COLS=as.factor(dimnames(this_array)[[3]])[array_index]
        plot(this_array[index_to_plot],col=COLS)
      } else if (array_level == 3){
        array_index = rep(rep(c(1:dim(this_array)[3]), each = dim(this_array)[3]), times = dim(this_array)[3])
        COLS=as.factor(dimnames(this_array)[[2]])[array_index]
        plot(this_array[index_to_plot],col=COLS)
      }
      

      plotfunc2(x,1:500,3) 给出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 2023-03-14
        • 2017-12-03
        • 2021-05-06
        • 2015-11-07
        相关资源
        最近更新 更多