【问题标题】:How to draw multiple 2d-plots in a 3d-plot in R?如何在 R 中的 3d 图中绘制多个 2d 图?
【发布时间】:2016-08-17 06:56:20
【问题描述】:

我不确定我提出的标题/问题是否正确。也许我的问题之一是我的词汇表中缺少术语。对不起。但是让我们试试:

我有数据(在此示例中为sleep),我将其描述为三维。也许真正的统计学家不会那样做?

我想我想将多个二维图绘制成一个三维图。我想将它们并排绘制。如果我错了,请纠正我。

我的问题是只有一行。 有两组。我想要每组一行。我认为与type='h' 相同的数据给出了更好的描述:

你能想象这里的两条线吗?我在那个概念中缺少什么? 我们可以使用另一个绘图库进行打印/发布。目前对我来说哪一个并不重要。也许我完全在错误的地方?

这是代码:

require('mise')
require('scatterplot3d')
mise()  # clear the workspace

# example data
print(sleep)

scatterplot3d(x=sleep$ID,
              x.ticklabs=levels(sleep$ID),
              y=sleep$group,
              y.ticklabs=levels(sleep$group),
              lab = c(length(unique(sleep$ID)), 1),
              z=sleep$extra,
              type='o')

还有数据

   extra group ID
1    0.7     1  1
2   -1.6     1  2
3   -0.2     1  3
4   -1.2     1  4
5   -0.1     1  5
6    3.4     1  6
7    3.7     1  7
8    0.8     1  8
9    0.0     1  9
10   2.0     1 10
11   1.9     2  1
12   0.8     2  2
13   1.1     2  3
14   0.1     2  4
15  -0.1     2  5
16   4.4     2  6
17   5.5     2  7
18   1.6     2  8
19   4.6     2  9
20   3.4     2 10

【问题讨论】:

    标签: r plot scatter3d


    【解决方案1】:

    您可以分两步手动添加行:

    # Store the plot in rr
    rr <- scatterplot3d(x=as.numeric(sleep$ID),
                        x.ticklabs=levels(sleep$ID),
                         y=sleep$group,
                         y.ticklabs=levels(sleep$group),
                         z=sleep$extra)
    # find all that belong to group one
    idx = sleep$group == 1
    # add the first line
    rr$points3d(x = sleep$ID[idx], y = rep(1, each = sum(idx)), z = sleep$extra[idx], type = 'l', col = 'red')
    # add the second line
    rr$points3d(x = sleep$ID[!idx], y = rep(2, each = sum(!idx)), z = sleep$extra[!idx], type = 'l', col = 'blue')
    

    所以添加丝带而不是线条会有所改变。特别是,功能区是使用polygon 函数绘制的。但是这个函数只处理 2D 坐标,所以我们需要用函数rr$xyz.convert 将我们的 3D 坐标转换为 2D 坐标。

    rr <- scatterplot3d(x=sleep$ID,
                        x.ticklabs=levels(sleep$ID),
                         y=sleep$group,
                         y.ticklabs=levels(sleep$group),
                         z=sleep$extra)
    idx = sleep$group == 1
    # draw first group
    mat = matrix(c(rep(sleep$ID[idx], 2),
                   rep(c(1, 1.05), each = sum(idx)), # 1.05 determines width
                   rep(sleep$extra[idx], 2)), ncol = 3)
    ll = rr$xyz.convert(mat)
    polygon(x = ll$x[c(1:10, 20:11)], 
            y = ll$y[c(1:10, 20:11)], col = 'red')
    # draw second group
    mat = matrix(c(rep(sleep$ID[!idx], 2),
                   rep(c(2, 1.95), each = sum(!idx)), # 1.95 determines width
                   rep(sleep$extra[!idx], 2)), ncol = 3)
    ll = rr$xyz.convert(mat)
    polygon(x = ll$x[c(1:10, 20:11)], 
            y = ll$y[c(1:10, 20:11)], col = 'blue')
    

    【讨论】:

    • 这不完全适合我的主要问题,但我如何将这两条线画成丝带? IMO 此处的解决方案看起来不太好,也无助于理解数据。
    • 您能否举例说明您希望情节的外观?也许像这样但只有两条线? i.stack.imgur.com/kBINP.png
    • 是的,这看起来不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多