2017-12-06 1 views
1

Ich möchte ein Histogramm aus bereits vorhandenen Klassen erstellen. Ich habe diesen Datensatz:Wie man ein Histogramm aus vorhandenen Zählungen mit ungleichmäßigen Behälterbreiten plottet unter Verwendung von ggplot

interval  counts 
0 - 8.50  2577 
8.51 - 10.00 1199 
10.01 - 12.00 1878 
12.01 - 14.00 637 
14.01 - 16.00 369 
16.01 - 18.00 98 
18.00 - 20.00 308 



library(ggplot2) 

plot_tab5_lohn <- ggplot(DS18, aes(x=interval)) + geom_histogram(stat="count") 
return(plot_tab5_lohn)}) 

in diesem Diagramm zur Folge hat:

https://i.stack.imgur.com/W3GDH.png

Ich mag die Zählungen auf der y-Achse sein und die Intervalle haben eine unterschiedliche Breite sein. Wie kann ich das machen?

EDIT: Ich habe es bis hierher geschafft: https://i.stack.imgur.com/W3GDH.png mit diesem Code

DS18$interval <- factor(DS18$interval, levels = DS18$interval) 
output$DS32 <- renderPlot({ 
plot_tab5_lohn <- ggplot(DS18, aes(x=interval, y = counts)) + 
geom_col() + 
geom_point(color = "red") + 
geom_line(aes(group = 1), color = "red") 
return(plot_tab5_lohn) 
}) 

ich die Stäbe möchten so breit wie das Intervall selbst sein. Und die Dichte sollte auf der Y-Achse sein. Die Summe der Flächen sollte dann 1 (100%) sein. So etwas wie dieses link

Antwort

1

Sie die Grenzen extrahieren, dann plotten geom_rect mit:

# Using dt from @www 
library(tidyr) 
dt2 <- separate(dt, interval, c('left', 'right'), sep = ' - ', convert = TRUE) 
ggplot(dt2) + 
    geom_rect(aes(xmin = left, xmax = right, ymin = 0, ymax = counts), 
      col = 1) + 
    geom_line(aes(x = right + (left - right)/2, y = counts), 
      col = 'red') 

enter image description here

Alternativ können Sie zunächst Ihre Daten in einzelne Beobachtungen erweitern, dies auch leicht ermöglicht es Ihnen, die Dichten plotten statt:

library(dplyr) 
library(tidyr) 
dt3 <- dt %>% 
    group_by(interval) %>% 
    do(data.frame(interval = rep.int(.$interval, .$counts), stringsAsFactors = FALSE)) %>% 
    separate(interval, c('left', 'right'), sep = ' - ', convert = TRUE) %>% 
    mutate(value = right + (left - right)/2) 
breaks <- c(0, unique(dt3$right)) 

ggplot(dt3, aes(value)) + 
    geom_histogram(aes(y = ..density..), breaks = breaks, col = 1) + 
    geom_freqpoly(aes(y = ..density..), breaks = breaks, col = 'red') 

enter image description here

+0

Vielen Dank! – FragenSteller

1

Sie stat = "identity" und fügen Sie eine y-ästhetische verwenden können Sie die gewünschte Diagramm erhalten:

ggplot(DS18, aes(x=interval, y = counts)) + 
    geom_histogram(stat="identity") 

, dass Sie dies gibt:

enter image description here

+0

'geom_col' die moderne Abkürzung für das ist. Irgendwelche Hinweise, wie man die unterschiedlich großen Behälter mit einem Barplot macht? – Axeman

1

Ich denke, was Sie brauchen, ist kein Histogramm, sondern ein Barplot. Hier habe ich gezeigt, wie man mit geom_col einen Barplot erstellt. Beachten Sie, dass ich factor verwendet habe, um den Balken jeder Klasse vor dem Zeichnen der Daten zu sortieren.

library(ggplot2) 

# Order the bar 
dt$interval <- factor(dt$interval, levels = dt$interval) 
# Create the bar plot 
ggplot(dt, aes(x=interval, y = counts)) + geom_col() 

enter image description here

DATA

dt <- read.table(text = "interval  counts 
'0 - 8.50'  2577 
       '8.51 - 10.00' 1199 
       '10.01 - 12.00' 1878 
       '12.01 - 14.00' 637 
       '14.01 - 16.00' 369 
       '16.01 - 18.00' 98 
       '18.00 - 20.00' 308", 
       header = TRUE, stringsAsFactors = FALSE) 
+0

Danke! Ich hätte gerne das Histogramm, um die Dichte der Intervalle zu visualisieren, und danach möchte ich ein Frequenzpolygon über dem Histogramm überlagern. Wissen Sie, ob dies aus meinen Daten möglich ist? – FragenSteller

+0

@FragenSteller Ich bin mir nicht sicher, wie man ein Frequenzpolygon überlagert. Vielleicht möchten Sie eine neue Frage mit einem reproduzierbaren Beispiel und der gewünschten Ausgabe, die dies anspricht, schreiben. – www

+0

Danke. Ich stellte mir das so vor: [imgur] (https: // imgur.com/a/gyxkB) – FragenSteller

Verwandte Themen