Bir arsada birçok değişkeni görselleştirme


25

Belirli değişkenlerin (~ 15) değerlerinin zaman içinde nasıl değiştiğini göstermek isterim, ancak değişkenlerin her yıl içinde birbirlerinden nasıl farklılaştığını da göstermek isterim. Böylece bu arsa oluşturdum:

görüntü tanımını buraya girin

Fakat renk şemasını değiştirirken veya farklı çizgi / şekil türleri eklerken bile, bu karışık görünmektedir. Bu tür verileri görselleştirmenin daha iyi bir yolu var mı?

R koduyla test verileri:

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
Verileri gönderebilir misiniz? Kabaca benzer örnekler bulmak yeterince kolaydır, ancak ipliği birbirine bağlı tutmak için, oynayacakları aynı kum havuzuna sahip insanlar yardımcı olacaktır. Ayrıca, yeşil bölgenin önemi nedir?
Nick Cox


@NickCox Tabii, bunu daha önce düşünmeliydim! Yeşil bölgeyi dışarıda bırakmadığım için dışarıda bıraktım (sadece "yeterli" kabul edilen değerlerin aralığını gösterir)

Yanıtlar:


42

Neyse ki veya başka bir şekilde, örneğinizin grafiksel olarak bir sorunu olduğunu göstermek için ilk önce en uygun boyutta (her 15 grup için 7 değere kadar); ikincisi ise diğer ve oldukça basit çözümlere izin vermek. Grafik, farklı alanlardaki insanlar tarafından genellikle spagetti denilen türdendir , ancak bu terimin şefkatli veya küfürlü olduğu her zaman açık değildir. Grafik, tüm grupların kolektif veya aile davranışlarını göstermektedir, ancak keşfedilecek ayrıntıyı göstermek oldukça umutsuzdur.

Standart bir alternatif, sadece ayrı grupları ayrı panellerde göstermektir; bu da sırayla gruptan gruba kesin karşılaştırmaları zorlaştırabilir; Her grup, diğer grupların bağlamından ayrılır.

Öyleyse neden her iki fikri de birleştirmiyorsunuz: her grup için ayrı bir panel değil, diğer grupları da fon olarak gösterin. Bu, odakta olan grubu vurgulama ve diğerlerini küçümseme, bu örnekte çizgi renginin, kalınlığın vb. Kullanımından dolayı yeterince kolay olan menteşelere dayanmaktadır.

görüntü tanımını buraya girin

Bu durumda, olası pratik veya bilimsel önem veya ilginin detayları vurgulanır:

  1. A ve M için sadece bir değerimiz var.

  2. Tüm diğer durumlarda tüm yıllar boyunca tüm değerlerimiz yok.

  3. Bazı gruplar yüksek, bazıları düşük, vb.

Burada bir yorum yapmaya çalışmıyorum: veriler anonimdir, ancak bu her durumda araştırmacının endişesidir.

Yazılımınızda neyin kolay veya mümkün olduğuna bağlı olarak, burada eksen etiketlerinin ve başlıkların tekrar edilip edilmediği gibi küçük ayrıntıların değiştirilmesine yönelik bir alan vardır (hem için hem de aleyhinde basit argümanlar vardır).

Büyük sorun, bu stratejinin daha genel olarak işe yarayacağı yönünde. Grup sayısı, her gruptaki puan sayısından daha fazla ana faktördür. Kabaca konuşursak, yaklaşım yaklaşık 25 gruba kadar çalışabilir (5 x 5 ekran, örneğin): daha fazla grupla, grafikler sadece küçülmekle ve daha zorlaşmakla kalmaz, aynı zamanda araştırmacı bile tüm taramaları yapma eğilimini kaybeder panelleri. Yüzlerce (binlerce, ...) grup olsaydı, gösterilecek az sayıda grup seçmek genellikle gerekli olurdu. Bazı "tipik" ve bazı "aşırı" panellerin seçilmesi gibi bazı kriterler karışımı gerekli olabilir; Bu, proje hedefleri ve her veri seti için neyin anlamlı olduğu konusunda bir fikir tarafından yönlendirilmelidir. Verimli olabilecek bir başka yaklaşım, her panelde az sayıda seriyi vurgulamaktır. Yani, 25 geniş grup olsaydı, her geniş grup diğerleriyle birlikte fon olarak gösterilebilirdi. Alternatif olarak, bir miktar ortalama veya başka bir özet olabilir. (Örneğin) ana veya bağımsız bileşenlerin kullanılması da iyi bir fikir olabilir.

Örnek, çizgi çizimleri gerektirse de, prensip doğal olarak çok geneldir. Örnekler çoğaltılabilir, dağılım grafikleri, model teşhis grafikleri vb.

Bu yaklaşım için bazı referanslar [diğerleri en açıktır]:

Cox, NJ 2010. Grafik altkümeleri. Stata Dergisi 10: 670-681.

Knaflic, CN 2015. Verilerle Hikaye Anlatma: İşletme Profesyonelleri için Veri Görselleştirme Kılavuzu. Hoboken, NJ: Wiley.

Koenker, R. 2005. Kuantil Regresyon. Cambridge: Cambridge Üniversitesi Yayınları. Bkz. Sf.12-13.

Schwabish, JA 2014. Bir ekonomistin verileri görselleştirme rehberi. Ekonomik Perspektifler Dergisi 28: 209-234.

Unwin, A. 2015. R. Boca Raton, FL: CRC Press ile Grafik Veri Analizi .

Wallgren, A., B. Wallgren, R. Persson, U. Jorner ve J.-A. Haaland. 1996. İstatistik ve Verilerin Grafiğini Oluşturma: Daha İyi Grafikler Yaratmak. Newbury Park, CA: Adaçayı.

Not: Grafik Stata'da oluşturuldu. subsetplotönce yüklü olması gerekir ssc inst subsetplot. Veriler R'den kopyalandı ve yapıştırıldı ve değerleri yıllarca gösterilecek şekilde tanımlandı 90 95 00 05 10 15. Ana komut

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

EDIT Extra referansları Mayıs, Eylül, Aralık 2016; Nisan, Haziran 2017, Aralık 2018, Nisan 2019:

Kahire, A. 2016. Gerçek Sanat: İletişim için Veri, Grafikler ve Haritalar. San Francisco, CA: Yeni Biniciler. s.211

Camões, J. 2016. İş Verileri: Microsoft Excel'de Etkili Grafikler ve Bilgi Grafikleri Oluşturmada En İyi Uygulamalar . San Francisco, CA: Yeni Biniciler. p.354

Carr, DB ve Pickle, LW 2010. Mikromaplarla Veri Modellerini Görselleştirme. Boca Raton, FL: CRC Press. s.85.

Grant, R. 2019. Veri Görselleştirme: Grafikler, Haritalar ve Etkileşimli Grafikler. Boca Raton, FL: CRC Press. s.52.

Koponen, J. ve Hildén, J. 2019. Veri Görselleştirme El Kitabı. Espoo: Aalto SANAT Kitapları. Bkz. P.101.

Kriebel, A. ve Murray, E. 2018. #MakeoverMondays: Verileri Görselleştirme ve Analiz Etme, Bir Anda Bir Grafik Hoboken, NJ: John Wiley. p.303.

Rougier, NP, Droettboom, M. ve Bourne, PE 2014. Daha iyi rakamlar için on basit kural. PLOS Hesaplamalı Biyoloji 10 (9): e1003833. doi: 10.1371 / journal.pcbi.1003833 buraya bağlantı

Schwabish, J. 2017. Daha İyi Sunumlar: Alimler, Araştırmacılar ve Wonks İçin Bir Kılavuz. New York: Columbia Üniversitesi Yayınları. Bkz. P.98.

Wickham, H. 2016. ggplot2: Veri Analizi için Zarif Grafikler. Cham: Springer. Bkz. P.157.


+1, harika, bu tür bir grafiği yapabilen bir R veya SAS işlevi var mı? Bu gerçekten harika.
Tahminci

Bu fikri gerçekten beğendim! Sadece ggplot2 kullanarak bunu R'ye çizmenin en iyi yolunu merak ediyorum. Cevabı kabul etmeden önce biraz bekleyeceğim, umarım iyidir.

2
Üzgünüm, SAS'ta herhangi bir şeyin nasıl yapılacağı hakkında hiçbir fikrim yok. Elbette Stata'nın yapabileceği, R'nin yapabileceği ya da daha iyisini yapabileceği bir şey, ya da kullanıcıları bana söylemeye devam ediyor ....
Nick Cox

@NickCox Hiç sorun değil, anladım, gerçekten iyi görünüyor ve amacım için mükemmel.

@NickCox, daha iki referanslar 1. olan WS Cleveland tarafından Grafik Verilerin Elements .A yeni kitabında, 2. Verilerle Storytelling: Cole Nussbaumer Knaflic tarafından İş Profesyoneller için Veri Görselleştirme Kılavuzu .Bu kitapta (# 2) bir örnek olay vardır "Spagetti grafiğinden kaçınma stratejileri" adlı bölüm.
tahminci

22

Nick'in cevabını tamamlayıcı olarak, işte benzetilmiş verileri kullanarak benzer bir çizim yapmak için bazı R kodları:

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)

örnek arsa


6

ggplot2R'de bir yaklaşım kullanmak isteyenler için facetshadepaketteki fonksiyonu düşünün extracat. Bu, sadece çizgi grafikleri için değil, genel bir yaklaşım sunar. İşte scatterpots'lu bir örnek ( bu sayfanın en altında ):

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")

görüntü tanımını buraya girin


EDIT: Adrian'ın simüle veri setini önceki cevabından kullanmak:

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("")

Diğer bir yaklaşım, biri arka plan için diğeri de vurgulanan durumlar için iki ayrı katman çizmektir. Hile, faceting değişkeni olmayan veri kümesini kullanarak arka plan katmanını çizmektir. Zeytinyağı veri seti için kod şudur:

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
Bu iyi bir genel yaklaşım gibi gözüküyor (+1), ancak belirli bir örnek daha farklı bir problemle ilgili. Farklı şekilde vurgulanmış bölgelere sahip bir dizi tekrarlanan dağılım grafiği, zaman serileri ile ilgili bir soru için çalışmayacak.
Sextus Empiricus

@martin Aslında öyle ve bu da Adrian'ın çözümü. İki özdeş etiketleme değişkeni kullandığını ve böylece arkaplan katmanına bırakılabileceğini unutmayın. Kodlama fikri aşağıdaki düzenli gösterimde daha belirgindir ve çoğu zaman grafiklerin zarif formatlanması kodun önemli kısımlarını gizleyebilir. 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

İşte Ch'den ilham alan bir çözüm. 11.3, ggplot2'deki Hadley Wickham'ın Kitabında "Teksas Toplu Konut Verileri" bölümü . Burada her zaman serisine doğrusal bir model yerleştiriyorum, artıkları (ortalama 0 civarında ortalanıyor) alıyorum ve farklı bir renkte bir özet çizgisi çiziyorum.

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")

görüntü tanımını buraya girin


1
Buradaki ana fikir, göze ve zihne yardımcı olmak için bir tür özet özeti ekleyebileceğiniz görünüyor. Kabul, ancak cevabınızda, orijinal birimleri ve değerleri bırakmak yerine, ortalama (veya referans seviyesine) 0 geçme şeklindeki değişimin sonucunu çıkarabilirsiniz. Konunun uzmanları ve / veya müşterileri, 24 veya 28 veya hangi değerler olursa olsun iyi düşünebilirler. Doğal olarak, buradaki veriler tartışma için sadece bir araçtır, ancak konu oldukça geneldir.
Nick Cox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.