Количество баров в гистограмме - R - PullRequest
0 голосов
/ 01 июля 2018

У меня две проблемы с гистограммой, которую я создаю: я пытаюсь сгенерировать гистограмму в R, используя функцию hist(), для частотного распределения числовой (интервальной) переменной, которое варьируется от 0 до 10. График, к которому я стремлюсь, должен генерировать 11 баров. Однако:

Проблема 1: Мой хороший друг R продолжает строить 10 баров. Проблема 2: Кроме того, я понятия не имею, как правильно отобразить значения тиков «x»: под каждым столбцом значение категории в «x» (т. Е. От 0 до 10). Я попытался использовать axis(), как вы можете видеть ниже в моем коде, но я не знаю, как это установить.

Я почти уверен, что это что-то довольно простое, но я не могу найти решение этих двух проблем. Чтобы решить первый, я думал, что установка breaks=11 решит это, но это не сработало. Я понятия не имею, как решить второй.

Это мои данные (128 участников исследования, каждый из которых набрал значение от 0 до 10):

structure(list(ID_Esc_Def = c(915151L, 91494L, 1303553L, 1310117L, 
1305411L, 1312263L, 1310121L, 1312264L, 1306498L, 1305413L, 1306497L, 
1307521L, 1305409L, 1307523L, 1306491L, 1311366L, 1307532L, 915155L, 
917111L, 915152L, 917120L, 1312267L, 1310119L, 1310114L, 1305414L, 
1305412L, 1306494L, 1303559L, 1307526L, 917112L, 91496L, 1305410L, 
1307527L, 917113L, 1307529L, 91491L, 1306495L, 1311363L, 1306493L, 
1312260L, 1306496L, 91493L, 1303561L, 915153L, 1310118L, 1307530L, 
1303557L, 1310113L, 1303556L, 1312259L, 1312258L, 91498L, 1311361L, 
1311367L, 1311365L, 1306499L, 1312262L, 915149L, 915148L, 91492L, 
1310120L, 1308168L, 1312266L, 1308167L, 1306492L, 1307531L, 1305408L, 
1307514L, 1310116L, 1310112L, 1306490L, 1307525L, 1310115L, 1308174L, 
1311368L, 915157L, 1312261L, 1308169L, 1312265L, 91495L, 1311360L, 
1305417L, 91489L, 915154L, 1303555L, 91497L, 917118L, 131389L, 
521390L, 521389L, 915150L, 131386L, 1305415L, 1311362L, 521386L, 
131382L, 91490L, 521391L, 1305416L, 1303562L, 1311369L, 917116L, 
521388L, 917114L, 1303558L, 521396L, 521387L, 1308172L, 131388L, 
521395L, 131390L, 131384L, 917117L, 1311364L, 131387L, 1308173L, 
917119L, 131385L, 917115L, 915156L, 521393L, 1308171L, 1308170L, 
1303560L, 521392L, 131391L, 131383L, 1303554L), asig_dic = c(0L, 
10L, 2L, 4L, 5L, 6L, 5L, 1L, 5L, 10L, 4L, 3L, 4L, 5L, 7L, 6L, 
5L, 4L, 3L, 2L, 4L, 6L, 1L, 3L, 5L, 5L, 3L, 3L, 7L, 0L, 3L, 5L, 
2L, 2L, 4L, 3L, 2L, 5L, 5L, 7L, 5L, 6L, 0L, 5L, 10L, 6L, 3L, 
5L, 5L, 6L, 10L, 5L, 5L, 8L, 10L, 5L, 2L, 5L, 4L, 3L, 1L, 2L, 
5L, 4L, 5L, 7L, 5L, 3L, 5L, 5L, 7L, 7L, 1L, 1L, 2L, 5L, 0L, 3L, 
5L, 3L, 5L, 10L, 4L, 0L, 1L, 5L, 5L, 5L, 5L, 5L, 6L, 10L, 4L, 
6L, 1L, 9L, 4L, 4L, 5L, 5L, 6L, 5L, 1L, 5L, 1L, 2L, 2L, 0L, 5L, 
5L, 6L, 6L, 5L, 3L, 5L, 3L, 3L, 5L, 5L, 6L, 4L, 2L, 2L, 0L, 4L, 
6L, 5L, 5L)), class = "data.frame", row.names = c(NA, -128L))

Это код, который я использую для генерации гистограммы:

m<-mean(dictator$asig_dic)
std<-sqrt(var(dictator$asig_dic))

quartz()
par(mfrow=c(1,1))
par(las=1)

hist(dictator$asig_dic, breaks = 11, col = "grey", freq = F, ylim=c(0,0.4), xaxt="n",
     xlab="Generosity (Donated Tokens in DG)", ylab="Relative Frequency", main="")

curve(dnorm(x, mean=m, sd=std), 
      col="darkblue", lwd=2, add=TRUE, yaxt="n")

axis(1, at = seq(0, 10, by = 1), las=1)

Как видите, есть 10 баров. Любая помощь?

Всего наилучшего,

Маурисио.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Как сказал @Lyngbakr, вы не получите 11 бинов, потому что аргумент breaks в hist() использует pretty значения. Проблема со значениями pretty заключается в том, что они выбраны таким образом, что они в 1,2 или 5 раз превышают степень 10. Следовательно, вы получаете только 10 бинов, а не 11. Один из способов "бороться" - это использовать больше бинов, чем необходимо (например, breaks = seq(-1, 10, 1) или breaks = seq(0, 10, 0.5)). Однако это может «испортить» ваш график. Вы можете посмотреть здесь для получения справки по pretty значениям и здесь для более подробного объяснения.

Если вы все еще хотите использовать base R (а не другие пакеты, такие как ggplot2), вы можете сделать это:

par(mfrow=c(1,1))
par(las=1)
hist(dictator$asig_dic,
     breaks = seq(-1, 10, 1),
     col = "grey", freq = F, ylim=c(0,0.4), xaxt="n",
     xlab="Generosity (Donated Tokens in DG)", ylab="Relative Frequency", main="")
curve(dnorm(x, mean=m, sd=std), 
      col="darkblue", lwd=2, add=TRUE, yaxt="n")
axis(1, at = seq(-1, 11, by = 1), las=1)
0 голосов
/ 01 июля 2018

Одним из решений является питье ggplot2 Kool Aid. Как вы можете видеть, есть 11 лотков (по запросу), а метки находятся в центре столбцов.

library(ggplot2)
library(ggthemes)

ggplot(dictator) + 
  geom_histogram(aes(x = asig_dic, y = (..count..)/sum(..count..)), 
                 bins = 11, fill = "gray", colour = "black") +
  stat_function(fun = dnorm, 
                args = list(mean = mean(dictator$asig_dic), 
                            sd = sd(dictator$asig_dic)),
                colour = "salmon", size = 1.25) +
  theme_tufte() +
  theme(axis.line = element_line(size = 1),
        axis.text = element_text(size = 18),
        axis.title = element_text(size = 20)) +
  xlab("Generosity (Donated Tokens in DG)") +
  ylab("Relative Frequency") +
  scale_x_continuous(breaks = 0:10)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...