Seite 1 von 1

ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Di Mär 29, 2022 2:23 pm
von wbart
Hallo,
ich habe eine Principle component analyse mit prcomp() gemacht. Nun versuche ich eine Scree plot zu machen. Wenn ich mir diesen mit dem plot() Befehl anschaue ist alles in Ordnung. Wenn ich versuche die Grafik mit ggplot2 in schön zu machen kommt eine Grafik heraus in der die Werte der x-Achse in der falschen Reihenfolge kommen.
Ich habe folgende Tabelle erstellt

Code: Alles auswählen

pca_GE_all_var_expl_tbl <-
  data.frame(PC = paste0(1:93),
             var_explained = pca_GE_all$sdev^2/sum(pca_GE_all$sdev^2))
Die Tabelle sieht so aus: Spalte PC Nummer von 1 bis 93, var_expl_tabl Werte geordnet vom höchsten zum kleinsten Wert.

Code: Alles auswählen

GE_all_var_expl_tbl
   PC var_explained
1   1  3.344084e-01
2   2  1.438074e-01
3   3  1.072239e-01
4   4  4.670794e-02
5   5  3.413497e-02
6   6  3.359805e-02
7   7  2.092461e-02
8   8  1.803073e-02
9   9  1.671627e-02
10 10  1.433452e-02
11 11  1.198894e-02
12 12  9.399608e-03
13 13  8.461168e-03
14 14  7.998514e-03
15 15  6.849114e-03
16 16  6.478053e-03
17 17  6.003372e-03
18 18  5.773242e-03
19 19  4.797188e-03
20 20  4.674142e-03
21 21  4.308319e-03
22 22  4.189525e-03
23 23  3.896836e-03
24 24  3.702643e-03
25 25  3.492253e-03
26 26  3.394300e-03
27 27  3.317103e-03
28 28  3.243657e-03
29 29  3.190355e-03
30 30  3.119645e-03
31 31  3.073774e-03
32 32  2.988087e-03
33 33  2.949264e-03
34 34  2.920289e-03
35 35  2.876176e-03
36 36  2.836995e-03
37 37  2.780262e-03
38 38  2.712839e-03
39 39  2.597859e-03
40 40  2.569712e-03
41 41  2.518777e-03
42 42  2.476687e-03
43 43  2.458967e-03
44 44  2.439450e-03
45 45  2.403536e-03
46 46  2.388050e-03
47 47  2.340619e-03
48 48  2.309623e-03
49 49  2.296063e-03
50 50  2.276667e-03
51 51  2.252636e-03
52 52  2.229747e-03
53 53  2.193251e-03
54 54  2.154634e-03
55 55  2.116372e-03
56 56  2.089635e-03
57 57  2.069938e-03
58 58  2.062687e-03
59 59  2.057265e-03
60 60  1.990263e-03
61 61  1.952521e-03
62 62  1.933391e-03
63 63  1.928793e-03
64 64  1.909842e-03
65 65  1.872618e-03
66 66  1.853267e-03
67 67  1.841589e-03
68 68  1.802654e-03
69 69  1.735345e-03
70 70  1.710964e-03
71 71  1.699947e-03
72 72  1.695379e-03
73 73  1.627852e-03
74 74  1.618843e-03
75 75  1.597681e-03
76 76  1.546884e-03
77 77  1.533414e-03
78 78  1.494242e-03
79 79  1.464179e-03
80 80  1.449263e-03
81 81  1.437032e-03
82 82  1.403733e-03
83 83  1.339541e-03
84 84  1.309905e-03
85 85  1.291101e-03
86 86  1.202688e-03
87 87  1.151050e-03
88 88  1.092907e-03
89 89  1.032700e-03
90 90  1.004124e-03
91 91  9.777109e-04
92 92  8.938960e-04
93 93  1.267195e-30
Die ggplot2 Grafik wollte ich wie folgt erstellen:

Code: Alles auswählen

ggplot(pca_GE_all_var_expl_tbl, aes(x=PC, y=var_explained))+
  geom_col()+
  labs(title = "Scree plot")
  
 
Das Ergebnis ist folgende Grafik angehängt als screeplot1. jpg.

Erwarten würde ich eine Grafik screeplot 2 von der Datenverteilung

Hat jemand eine Idee warum das so ist?

VG
Werner

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Di Mär 29, 2022 3:51 pm
von Athomas
Offenbar hast Du "PC" falsch - als Faktor - eingelesen.

Code: Alles auswählen

library(data.table)
library(ggplot2)

DT <- fread("P:/R/R Forum/ggplot/Daten.txt")

ggplot(DT, aes(x=PC, y=var_explained))+
  geom_col()+
  labs(title = "Scree plot")
Scree plot.jpeg

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Di Mär 29, 2022 4:54 pm
von bigben
Hallo Werner,

Das Problem liegt dann wohl in dem paste0, das Strings erzeugt.

LG,
Bernhard

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Mi Mär 30, 2022 10:23 am
von Athomas
bigben hat geschrieben: Di Mär 29, 2022 4:54 pm Das Problem liegt dann wohl in dem paste0, das Strings erzeugt.
Oha - das hatte ich gar nicht gesehen :oops: ! Wie kommt man denn auf sowas :o ?

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Do Mär 31, 2022 9:40 am
von wbart
Aber was ist, wenn man Namen in der X Achse hat? Das ist doch eher der Normalfall?

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Do Mär 31, 2022 10:56 am
von Athomas
Dann muss man die Faktorstufen in eine geeignete Reihenfolge bringen...

https://rstudio-pubs-static.s3.amazonaw ... 13469.html

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Do Mär 31, 2022 2:48 pm
von bigben
Wenn man statt ggplot2 die base Grafiken nimmt, dann hat man die Wahl: Nimmt man das formula-Interface von barplot, dann verhält es sich wie ggplot2:

Code: Alles auswählen

d <- read.table("http://forum.r-statistik.de/download/file.php?id=1710",
                header = TRUE)
d$PC = as.character(d$PC)
barplot(var_explained ~ PC, data = d)
Ruft man die Funktion stattdessen mit Vektoren ohne formula auf, dann plottet es so, wie hier gewünscht:

Code: Alles auswählen

barplot(height = d$var_explained, names.arg = d$PC,
        xlab ="Component", ylab ="Variance explained")
Rplot.png
Rplot.png (3.97 KiB) 4558 mal betrachtet
LG,
Bernhard

Re: ggplot2 geom_col() unterscheidet sich von plot()

Verfasst: Di Apr 05, 2022 2:31 pm
von wbart
Thanks to all !