具有离散x轴和多个系列的线图

时间:2019-06-12 22:44:10

标签: r ggplot2

我正在尝试绘制特定地形的训练区域像素的光谱响应。我有一个数据框,其中包含7个波段(列)中每个波段的反射率值和每个特定像素的ID。我希望每个ID(像素)都有单独的一行,并希望能够将波段号用作x轴。

我的数据框如下:

Class B1 B2 B3 B4 B5 B6 B7 ID
  2 12345 13456 678 13456 7685 9870 12345 1

2 12345 1356 678 1456 7685 970 1235 2 ........

structure(list(B1 = c(12438, 12649, 12405, 12371, 13085, 12822
), B2 = c(11678, 11902, 11648, 11621, 12365, 12270), B3 = c(10982, 
11467, 10961, 11021, 11478, 12159), B4 = c(10834, 11373, 10767, 
10910, 10794, 12403), B5 = c(14453, 14079, 11810, 12060, 10403, 
14923), B6 = c(13200, 14484, 11431, 12633, 8882, 16210), B7 = c(11414, 
12318, 10370, 10641, 8020, 14293), class = structure(c(1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("2", "5", "9", "10", "12", "15", 
"18", "20", "21"), class = "factor"), ID = 1:6), row.names = c(NA, 
6L), class = "data.frame") 

理想情况下,我希望能够在班级(总共9个)上进行过滤,并绘制单个班级或多个班级以检查班级之间的重叠情况

我尝试使用熔解来取消数据框的旋转,虽然取得了一定的成功,但是我必须按类总结光谱值。它还不喜欢我的x轴值,因为它们是离散的,因此不会连接线。我通过为数据段1-7的数据帧添加一个整数列来解决此问题。

对于此绘图,我想在绘图上将每个单独的像素(行)显示为一条单独的线(而不是摘要),以查看是否选择了在所有7个波段中分组在一起的像素。波段从B1-B7跨过x轴

您可以在ggplot中的一个绘图上放置的单个序列数是否有限制?有没有一种更简单的方法可以绘制此数据框,而不必使用melt?

更新。

我使用了熔化,并向熔化的数据帧添加了一个整数值,这样我可以为x轴使用连续值1:7来对应带编号。这是融合的数据框的标题。看起来仍然无法处理单独的行,并希望我总结这些值。

structure(list(ID = 1:6, variable = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("B1", "B2", "B3", "B4", "B5", "B6", "B7"), class = 
"factor"), 
value = c(12438, 12649, 12405, 12371, 13085, 12822), band = c(1, 
1, 1, 1, 1, 1)), row.names = c(NA, 6L), class = "data.frame")

1 个答案:

答案 0 :(得分:0)

以下是使用您的主要数据的示例。如果您的数据冗长/整洁/融化,ggplot2确实会更轻松,所以在几乎所有情况下,我都建议这样做。

library(tidyverse)
structure(list(B1 = c(12438, 12649, 12405, 12371, 13085, 12822), 
               B2 = c(11678, 11902, 11648, 11621, 12365, 12270), 
               B3 = c(10982, 11467, 10961, 11021, 11478, 12159), 
               B4 = c(10834, 11373, 10767, 10910, 10794, 12403), 
               B5 = c(14453, 14079, 11810, 12060, 10403, 14923), 
               B6 = c(13200, 14484, 11431, 12633, 8882, 16210), 
               B7 = c(11414, 12318, 10370, 10641, 8020, 14293), 
               class = structure(c(1L, 1L, 1L, 1L, 1L, 1L), 
              .Label = c("2", "5", "9", "10", "12", "15", "18", 
                         "20", "21"), class = "factor"), 
               ID = 1:6), row.names = c(NA, 6L), class = "data.frame") %>%

  # keep class and ID, but combine other columns into a
  #   key/value pair
  gather(col, val, -c(class, ID)) %>%  # from `tidyr`
  ggplot(aes(col, val, color = ID, group = ID)) + 
    geom_line() +
    facet_wrap(~class)

enter image description here