【问题标题】:How can I visualize and process this 3d data如何可视化和处理这些 3d 数据
【发布时间】:2020-10-16 21:51:57
【问题描述】:

我有一个像这样的 3 维数据

   x1,x2,x3,x4
y1 0  0  0  3
y2 3  2  0  4 
y3 1  4  0  0 
... 

我想在 3d 地图中将其可视化 所以我认为我需要以这种形式重塑数据

x  y  z
-------
x1 y1 0
x1 y2 3
x1 y3 1
x2 y1 0
x2 y2 0
x2 y3 0 
x3 y1 3
x3 y3 4

我的实际数据有 ca 900 x 观察和 7000 y 观察,所以如果有其他方法可以在不重塑的情况下可视化这些数据,这也会有所帮助

【问题讨论】:

标签: python r pandas


【解决方案1】:

这在 R 中非常简单。假设我有一个这样的矩阵:

set.seed(69)
m <- matrix(rpois(100, 5), nrow = 10, dimnames = list(y = 1:10, x = 1:10))
m
#>     x
#> y    1 2 3 4  5 6 7  8  9 10
#>   1  5 8 4 6 11 5 5  5  6  6
#>   2  7 4 3 8  4 7 2  6  5  7
#>   3  6 8 6 4  5 6 1  8  5  5
#>   4  7 3 4 5  6 4 5  7  6  4
#>   5  4 3 3 4  3 9 1  2 10  2
#>   6  8 3 3 6  1 6 8 10  5  3
#>   7  3 2 6 6  2 3 4  4  6  5
#>   8  7 6 6 5  3 3 5  5  7  3
#>   9  3 2 2 4  4 7 8  4  5  4
#>   10 1 7 4 5  3 6 6  6  6  5

我可以像这样将它重塑为 x、y 和 value 列:

library(reshape2)

df <- melt(m)

并像这样绘制它:

ggplot(df, aes(x, y, fill = value)) + 
  geom_tile() + 
  scale_fill_viridis_c() + coord_equal() + theme_minimal()

您也不必担心重塑的计算时间。这是重塑 700 * 900 矩阵的基准:

 m <- matrix(rpois(630000, 5), nrow = 700, dimnames = list(y = 1:700, x = 1:900))
microbenchmark::microbenchmark(melt(m))
#> Unit: milliseconds
#>     expr     min       lq     mean  median      uq     max neval
#>  melt(m) 10.5401 13.45535 16.60985 14.1058 14.8661 79.3941   100

只需要 14 毫秒,所以你的大矩阵可以在the blink of an eye. 中重塑大约 7 次

【讨论】:

  • 谢谢,我想试试这个,但在 FUN(X[[i]], ...) 中出现错误:找不到对象“x”。我有一个 excel 数据。当我执行 df 时应该添加什么选项
【解决方案2】:

这是一个基本的 R 选项

cbind(`colnames<-`(rev(expand.grid(attributes(m)$dimnames)),c("x","y")),z = c(m))

给了

    x  y  z
1  x1 y1  1
2  x1 y2  2
3  x1 y3  3
4  x2 y1  4
5  x2 y2  5
6  x2 y3  6
7  x3 y1  7
8  x3 y2  8
9  x3 y3  9
10 x4 y1 10
11 x4 y2 11
12 x4 y3 12

数据

> dput(m)
structure(1:12, .Dim = 3:4, .Dimnames = list(c("y1", "y2", "y3"
), c("x1", "x2", "x3", "x4")))

【讨论】:

    【解决方案3】:

    如果您对热图可视化感到满意,有两个选项可以实现:

    1. 熊猫styling:
        df.style.background_gradient(cmap='viridis')
    

    1. Seaborn heatmap:
        import seaborn as sns
        sns.heatmap(df, annot=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2019-09-15
      • 2018-05-31
      • 2021-08-23
      相关资源
      最近更新 更多