barplot () с точками данных - база R - PullRequest
2 голосов
/ 16 марта 2020

Я пытаюсь построить гистограмму с точками данных вверху в base R.

Я использую base R, потому что невозможно просто создать текстуру для заливки ggplot (например, см. здесь , а ggtexture нет разрешить сложное редактирование).

Используя функцию barplot() и points(), я могу сделать это:

library(tidyverse)

#Sample data
data <- iris %>% 
  group_by(Species) %>% 
  summarise(m = mean(Sepal.Length), 
            se = sd(Sepal.Length)/
              sqrt(sum(!is.na(Sepal.Length)))) %>% 
  ungroup()

chart <- barplot(height=data$m, names=data$Species,
        density = c(5, 5, 5),
        angle = c(0,45,90),
        col = "brown",
        width = c(0.1,0.1,0.1), 
        font.axis = 2, 
        border = c("black"), 
        lwd = 2)

points(x = chart,
       y = data$m)

enter image description here

Однако я хотел бы создать что-то похожее на следующее:

iris %>% 
  group_by(Species) %>% 
  summarise(m = mean(Sepal.Length), 
            se = sd(Sepal.Length)/
              sqrt(sum(!is.na(Sepal.Length)))) %>% 
  ungroup() %>%
  ggplot(aes(Species, m, 
             group = Species, 
             color = Species, 
             shape = Species)) + 
  geom_bar(stat = "identity", fill="white",
           color="black") +
  geom_jitter(
    aes(Species, Sepal.Length),
    data = iris) 

enter image description here

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Преобразование Species в коэффициент с использованием вывода barplot в качестве меток. При преобразовании обратно в число c с использованием подхода as.numeric(as.character(x))) точки появляются в нужных местах для каждой группы.

# op <- par(xpd=TRUE)
b <- barplot(with(iris, tapply(Sepal.Length, Species, mean)), density=c(5, 5, 5), 
             angle=c(0, 45, 90), 
             col="brown", 
             width=c(0.1, 0.1, 0.1), 
             font.axis=2, 
             border=c("black"), 
             lwd=2, 
             ylim=c(0, max(jitter(iris$Sepal.Length)) * 1.15)  ## better use dynamic ylim
             )
iris$Species.f <- factor(iris$Species, labels=b)
with(iris, points(jitter(as.numeric(as.character(iris$Species.f))), 
                  jitter(Sepal.Length), pch=as.numeric(Species) + 14, 
                  col=as.numeric(Species) + 1, cex=.8))
legend("topleft", title="Species", legend=levels(iris$Species), 
       pch=seq(levels(iris$Species)) + 14, col=seq(levels(iris$Species)) + 1, 
       horiz=TRUE, cex=.8)
box(lwd=2)
# par(op)

enter image description here

3 голосов
/ 16 марта 2020

Вы можете использовать функцию jitter здесь.

chart <- barplot(height=data$m, names=data$Species,
                 density = c(5, 5, 5),
                 angle = c(0,45,90),
                 col = "brown",
                 width = c(0.1,0.1,0.1), 
                 font.axis = 2, 
                 border = c("black"), 
                 lwd = 2, las=1,
                 ylim=c(0,8))

points(x = lapply(rep(chart, each=50), jitter, amount=0.05),
       y = iris$Sepal.Length,
       col=iris$Species, pch=20)

enter image description here

...