Memvisualisasikan banyak variabel dalam satu plot


25

Saya ingin menunjukkan bagaimana nilai-nilai variabel tertentu (~ 15) berubah seiring waktu, tetapi saya juga ingin menunjukkan bagaimana variabel berbeda satu sama lain di setiap tahun. Jadi saya membuat plot ini:

masukkan deskripsi gambar di sini

Tetapi bahkan ketika mengubah skema warna atau menambahkan jenis garis / bentuk yang berbeda ini terlihat berantakan. Apakah ada cara yang lebih baik untuk memvisualisasikan data semacam ini?

Uji data dengan kode R:

structure(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
    Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
    2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
    1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
    2011L, 2015L), Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
    25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
    25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
    29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
    22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
    28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
    23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
    28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
    28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
    23.8, 28.32, 27, 29.5, 29.15, 27.6)), row.names = c(1L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), na.action = structure(c(2L, 
3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
85L, 86L, 93L, 94L, 102L, 103L), .Names = c("2", "3", "11", "12", 
"33", "34", "42", "43", "51", "52", "60", "61", "76", "77", "85", 
"86", "93", "94", "102", "103"), class = "omit"), class = "data.frame", .Names = c("Var", 
"Year", "Val"))

2
Bisakah Anda memposting data? Cukup mudah untuk menemukan contoh yang kira-kira mirip, tetapi untuk menjaga agar utasnya tetap terhubung, orang-orang yang memiliki kotak pasir yang sama untuk bermain akan membantu. Juga, apa pentingnya zona hijau?
Nick Cox


@NickCox Tentu, seharusnya memikirkan itu sebelumnya! Saya meninggalkan zona hijau karena itu tidak penting (hanya menunjukkan kisaran nilai yang dianggap "cukup")

Jawaban:


42

Kebetulan atau tidak, contoh Anda adalah ukuran optimal (hingga 7 nilai untuk masing-masing 15 kelompok) pertama, untuk menunjukkan bahwa ada masalah secara grafis; dan kedua, untuk memungkinkan solusi lain yang cukup sederhana. Grafik adalah jenis yang sering disebut spageti oleh orang-orang di bidang yang berbeda, meskipun tidak selalu jelas apakah istilah itu dimaksudkan sebagai kasih sayang atau kasar. Grafik memang menunjukkan perilaku kolektif atau keluarga semua kelompok, tetapi tidak ada harapan untuk menunjukkan detail yang akan dieksplorasi.

Salah satu alternatif standar adalah hanya untuk menunjukkan kelompok yang terpisah di panel yang terpisah, tetapi pada gilirannya dapat membuat perbandingan kelompok-ke-kelompok yang tepat menjadi sulit; masing-masing kelompok dipisahkan dari konteks kelompok lainnya.

Jadi mengapa tidak menggabungkan kedua ide: panel terpisah untuk masing-masing kelompok, tetapi juga menunjukkan kelompok lain sebagai latar belakang? Hal ini bergantung pada penyorotan grup yang fokus dan mengecilkan yang lain, yang cukup mudah dalam contoh ini mengingat beberapa penggunaan warna garis, ketebalan dll. Dalam contoh lain, pilihan penanda atau simbol simbol mungkin lebih alami.

masukkan deskripsi gambar di sini

Dalam hal ini, rincian kemungkinan kepentingan atau kepentingan praktis atau ilmiah mungkin disorot:

  1. Kami hanya memiliki satu nilai untuk A dan M.

  2. Kami tidak memiliki semua nilai untuk semua tahun yang diberikan dalam semua kasus lainnya.

  3. Beberapa kelompok plot tinggi, beberapa rendah, dan sebagainya.

Saya tidak akan mencoba penafsiran di sini: datanya anonim, tetapi itu adalah masalah peneliti.

Bergantung pada apa yang mudah atau mungkin dalam perangkat lunak Anda, ada ruang untuk mengubah detail kecil di sini, seperti apakah label dan judul sumbu diulangi (ada argumen sederhana yang mendukung dan menentang).

Masalah yang lebih besar adalah sejauh mana strategi ini akan bekerja secara lebih umum. Jumlah kelompok adalah pendorong utama, lebih dari jumlah poin di setiap kelompok. Secara kasar, pendekatan ini dapat bekerja hingga sekitar 25 kelompok (tampilan 5 x 5, katakanlah): dengan lebih banyak kelompok, grafik tidak hanya menjadi lebih kecil dan lebih sulit dibaca, tetapi bahkan peneliti kehilangan kecenderungan untuk memindai semua panel. Jika ada ratusan (ribuan, ...) grup, biasanya penting untuk memilih sejumlah kecil grup untuk ditampilkan. Beberapa campuran kriteria seperti memilih beberapa panel "tipikal" dan beberapa "ekstrim" akan dibutuhkan; yang harus didorong oleh tujuan proyek dan beberapa ide tentang apa yang masuk akal untuk setiap dataset. Pendekatan lain yang bisa efisien adalah dengan menekankan sejumlah kecil seri di setiap panel. Begitu, jika ada 25 grup besar, masing-masing grup besar dapat ditampilkan dengan yang lain sebagai latar belakang. Atau, mungkin ada beberapa rangkuman atau rangkuman lainnya. Menggunakan (misalnya) komponen utama atau independen mungkin juga merupakan ide bagus.

Meskipun contoh membutuhkan plot garis, prinsipnya secara alami lebih umum. Contoh dapat dikalikan, plot pencar, plot diagnostik model, dll.

Beberapa referensi untuk pendekatan ini [lainnya disambut baik]:

Cox, NJ 2010. Grafik himpunan bagian. Jurnal Stata 10: 670-681.

Knaflic, CN 2015. Bercerita dengan Data: Panduan Visualisasi Data untuk Profesional Bisnis. Hoboken, NJ: Wiley.

Koenker, R. 2005. Regresi Kuantitatif. Cambridge: Cambridge University Press. Lihat pp.12-13.

Schwabish, JA 2014. Panduan ekonom untuk memvisualisasikan data. Jurnal Perspektif Ekonomi 28: 209-234.

Unwin, A. 2015. Analisis Data Grafis dengan R. Boca Raton, FL: CRC Press.

Wallgren, A., B. Wallgren, R. Persson, U. Jorner, dan J.-A. Haaland. 1996. Grafik Statistik dan Data: Membuat Grafik yang Lebih Baik. Newbury Park, CA: Sage.

Catatan: Grafik dibuat di Stata. subsetplotharus diinstal terlebih dahulu dengan ssc inst subsetplot. Data disalin dan disisipkan dari R dan label nilai didefinisikan untuk menunjukkan tahun sebagai 90 95 00 05 10 15. Perintah utamanya adalah

subsetplot connected Val Year, by(Var) c(L) lcolor(gs12) backdrop(line) xtitle("") combine(imargin(small)) subset(lcolor(blue) mcolor(blue))

EDIT Referensi tambahan Mei, September, Desember 2016; April, Juni 2017, Desember 2018, April 2019:

Kairo, A. 2016. Seni Sejati: Data, Bagan, dan Peta untuk Komunikasi. San Francisco, CA: Penunggang Baru. hal.211

Camões, J. 2016. Data di Tempat Kerja: Praktik Terbaik untuk Membuat Grafik dan Grafik Informasi yang Efektif di Microsoft Excel . San Francisco, CA: Penunggang Baru. hal.354

Carr, DB dan Pickle, LW 2010. Memvisualisasikan Pola Data dengan Micromaps. Boca Raton, FL: CRC Press. hal.85.

Grant, R. 2019. Visualisasi Data: Grafik, Peta, dan Grafik Interaktif. Boca Raton, FL: CRC Press. hal.52.

Koponen, J. dan Hilden, J. 2019. Buku Pegangan Visualisasi Data. Espoo: Aalto ARTS Books. Lihat hal.101.

Kriebel, A. and Murray, E. 2018. #MakeoverMonday: Meningkatkan Cara Kami Visualisasikan dan Analisis Data, Satu Bagan Sekaligus. Hoboken, NJ: John Wiley. hal.303.

Rougier, NP, Droettboom, M. dan Bourne, PE 2014. Sepuluh aturan sederhana untuk angka yang lebih baik. PLOS Biologi Komputasi 10 (9): e1003833. doi: 10.1371 / journal.pcbi.1003833 tautan di sini

Schwabish, J. 2017. Presentasi Lebih Baik: Panduan bagi Para Cendekiawan, Peneliti, dan Wonks. New York: Columbia University Press. Lihat hal.98.

Wickham, H. 2016. ggplot2: Grafik Elegan untuk Analisis Data. Cham: Springer. Lihat hal.157.


+1, bagus, apakah ada fungsi R atau SAS yang dapat melakukan jenis bagan ini? Sangat bagus.
peramal

Saya sangat suka ide ini! Hanya ingin tahu tentang cara terbaik untuk merencanakan ini di R menggunakan ggplot2. Saya hanya akan menunggu sebentar sebelum saya menerima jawabannya, harap itu baik-baik saja.

2
Maaf, saya tidak tahu bagaimana melakukan apa pun di SAS. Tentunya apa pun yang dapat dilakukan Stata, R dapat melakukannya dengan baik atau lebih baik, atau begitulah penggunanya terus memberi tahu saya ...
Nick Cox

@NickCox Tidak masalah sama sekali, saya menemukan jawabannya, terlihat sangat bagus dan sempurna untuk tujuan saya.

@NickCox, dua referensi lagi adalah 1. Unsur-unsur Grafik Data oleh WS Cleveland . Sebuah buku baru, 2. Mendongeng dengan Data: Panduan Visualisasi Data untuk Profesional Bisnis oleh Cole Nussbaumer Knaflic . Buku ini (# 2) memiliki studi kasus bab yang disebut "Strategi untuk menghindari grafik spageti".
peramal

22

Sebagai pelengkap jawaban Nick, berikut beberapa kode R untuk membuat plot serupa menggunakan data simulasi:

library(ggplot2)

get_df <- function(label="group A", n_obs=10, drift=runif(1)) {
    df <- data.frame(time=seq(1, n_obs), label=label)
    df$y <- df$time * drift + cumsum(rnorm(n_obs))
    return(df)
}
df_list <- lapply(sprintf("group %s", toupper(letters[1:9])),
                  function(label) { get_df(label) })
df <- do.call(rbind, df_list)
df$label2 <- df$label

p <- (ggplot(df, aes(x=time, y=y, group=label2)) +
      geom_line(size=0.9, alpha=0.8,
                data=df[, c("time", "y", "label2")], color="grey") +
      geom_line(size=1.1, color="black") +
      ylab("") +
      theme_bw() +
      theme(panel.border=element_blank()) +
      theme(strip.background=element_blank()) +
      facet_wrap(~ label))
p
ggsave("example_facet.png", p, width=10, height=8)

contoh plot


6

Bagi mereka yang ingin menggunakan ggplot2pendekatan dalam R mempertimbangkan facetshadefungsi dalam paket extracat. Ini menawarkan pendekatan umum, bukan hanya untuk plot garis. Berikut ini adalah contoh dengan sebaran (dari kaki halaman ini ):

data(olives, package="extracat")
library(scales)
fs1 <- facetshade(data = olives,
                  aes(x = palmitic, y = palmitoleic), f = .~Area)
fs1 + geom_point(colour = alpha("black", 0.05)) +
      geom_point(data = olives, colour = "red") +
      facet_wrap(f=~Area, nrow=3) + theme(legend.position="none")

masukkan deskripsi gambar di sini


EDIT: Menggunakan dataset simulasi Adrian dari jawaban sebelumnya:

library(extracat)
facetshade(df, aes(x=time, y=y), f = .~label, bg.all = FALSE, keep.orig = TRUE) +
           geom_line(aes(x=time, y=y, group=orig.label),colour = alpha(1,0.3)) +
           geom_line(data=df, aes(colour=label), size = 1.2) + xlab("") + ylab("")

Pendekatan lain adalah menggambar dua lapisan terpisah, satu untuk latar belakang dan satu untuk kasus-kasus yang disorot. Caranya adalah dengan menggambar lapisan latar belakang menggunakan dataset tanpa variabel faceting. Untuk dataset minyak zaitun kodenya adalah:

data(olives, package="extracat")
ggplot(olives, aes(palmitic, palmitoleic)) + 
  facet_wrap(~Area, nrow=3) + 
  geom_point(data=olives %>% select(-Area), colour=alpha("black", 0.05)) + 
  geom_point(data=olives, colour="red") + 
  theme(legend.position="none")

1
Ini sepertinya pendekatan umum yang bagus (+1), tetapi contoh khusus lebih berkaitan dengan masalah yang berbeda. Sekelompok plot pencar berulang dengan daerah yang disorot berbeda tidak akan bekerja untuk pertanyaan yaitu tentang deret waktu.
Sextus Empiricus

@martin Sebenarnya begitu dan itu juga solusi Adrian. Perhatikan bahwa ia menggunakan dua variabel pelabelan identik sehingga satu dapat dijatuhkan di lapisan latar belakang. Ide pengkodean lebih jelas dengan notasi rapi di bawah ini dan, seperti yang sering terjadi, format grafik yang elegan dapat menutupi bagian-bagian penting dari kode. ggplot(df %>% select(-label), aes(x=time, y=y, group=label2)) + geom_line(alpha=0.8, color="grey") + labs(y=NULL) + geom_line(data=df, color="red") + facet_wrap(~ label)
Antony Unwin

5

Ini adalah solusi yang terinspirasi oleh Ch. 11.3, bagian tentang "Data Perumahan Texas", dalam Buku Hadley Wickham di ggplot2 . Di sini saya memasukkan model linier ke setiap deret waktu, mengambil residu (yang berpusat di sekitar rata-rata 0), dan menggambar garis ringkasan dalam warna yang berbeda.

library(ggplot2)
library(dplyr)
#works with dplyr version 0.4.3.9000 from Github (hadley/dplyr@4f2d7f8), or higher

df1 <- as.data.frame(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
                                 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
                                 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
                                 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
                                 14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
                                 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
                                                                                               "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
                                                                                               "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
               Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
                        2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
                        1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
                        2011L, 2015L), 
               Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
                       25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
                       25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
                       29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
                       22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
                       28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
                       23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
                       28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
                       28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
                       23.8, 28.32, 27, 29.5, 29.15, 27.6)), 
               row.names = c(1L, 4L, 
                           5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
                           21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
                           36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
                           53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
                           68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
                           83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
                           100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), 
               na.action = structure(c(2L, 
                          3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
                          85L, 86L, 93L, 94L, 102L, 103L), 
                .Names = c("2", "3", "11", "12","33", "34", "42", "43", "51", "52", "60", 
                           "61", "76", "77", "85", "86", "93", "94", "102", "103"), class = "omit"), 
                class = "data.frame", .Names = c("Var","Year", "Val"))


df1 %>%
        group_by(Var) %>%
        do(mutate(.,resid = resid(lm(Val ~ Year, data=., na.action = na.exclude)))) %>%
        ggplot(aes(Year, resid)) +
        labs(y=paste0("Val "), x="Year") +
        geom_line(aes(group = Var), alpha = 1/5) +
        geom_line(stat = "summary", fun.y = "mean", colour = "red")

masukkan deskripsi gambar di sini


1
Gagasan utama di sini tampaknya adalah bahwa Anda dapat menambahkan semacam kurva ringkasan untuk membantu mata dan pikiran. Setuju, tetapi dalam jawaban Anda, Anda bisa menguraikan trade-off pada pergeseran ke mean (atau tingkat referensi) 0 daripada meninggalkan unit dan nilai-nilai asli. Pakar masalah dan / atau klien mungkin berpikir dalam 24 atau 28 atau nilai apa pun. Tentu saja data di sini hanyalah wahana untuk diskusi tetapi intinya sangat umum.
Nick Cox
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.