带数据点的barplot()-基R

带数据点的barplot()-基R,r,plot,bar-chart,R,Plot,Bar Chart,我试图在base R中绘制数据点位于顶部的条形图 我之所以使用base R,是因为不可能在ggplot中以简单的方式创建纹理填充(例如,请参见,并且不允许复杂的编辑) 使用barplot()函数和points(),我可以执行以下操作: library(tidyverse) #Sample data data <- iris %>% group_by(Species) %>% summarise(m = mean(Sepal.Length),

我试图在
base R
中绘制数据点位于顶部的条形图

我之所以使用
base R
,是因为不可能在
ggplot
中以简单的方式创建纹理填充(例如,请参见,并且不允许复杂的编辑)

使用
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)

您可以在此处使用
抖动功能

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)

图表使用
条形图
作为标签输出,将
物种
转换为因子。然后使用
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)

#op我不想使用ggplot,除非可以使用纹理填充。谢谢您的评论,如果我的组大小不一致,您有解决方案吗?因此,
rep(chart,each=50)
是不适用的?那么代码会稍微难看一些:
c(rep(chart[1],n1),rep(chart[2],n2),rep(chart[3],n3))
非常好地使用了
xpd=TRUE
。我忘了那个了。@Edward是的,但ylim可能更好,否则我们在绘制区域时会遇到麻烦。
# 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)