1

我正在尝试将条形之间的距离缩小得更窄,但是, position_dodge 似乎在调整条形之间的距离方面不起作用。

下面是我的代码示例,其中有两个宽度不同的输出,一个为 0.7,一个为 5,但条形之间的宽度不受影响......:

library(ggplot2)
library(grid)
library(ggthemes)
library(scales)
library(gridExtra)

variables = c('a','b','c','d','e')
values = c(0.2,0.4,0.6,0.8,1.0)
std = c(0.05,0.06,0.03,0.08,0.09)

Data = data.frame(variables, values, std)

f3 = ggplot(data = Data, aes(x = variables, y = values, group = variables) ) + 
  geom_bar(stat='identity',width=0.6,position=position_dodge(width = 0.7),fill=c('#FF7F0E','#2CA02C','#D62728', '#00008B', '#B23AEE')) +
  coord_flip() +
  geom_errorbar(aes(ymin=values-std, ymax=values+std),
                width=.2,size=0.3) +
  scale_y_continuous("Variable Importance", expand = c(0,0),limits = c(0, 1.1), breaks=seq(0, 1.1, by = 0.1)) + # rescale Y axis slightly
  scale_x_discrete("Variables", limits = c('a','b',"c","d","e" )) +
  theme_bw() + # make the theme black-and-white rather than grey (do this before font changes, or it overrides them)
  theme(
    line = element_line(size=0.3),
    plot.title = element_blank(), # use theme_get() to see available options
    axis.title.x = element_text(family='sans',size=13),
    axis.title.y = element_text(family='sans',size=13, angle=90),
    axis.text.x = element_text(family='sans',vjust=0.4,size=11),
    axis.text.y = element_text(family='sans',size=11),
    panel.grid.major = element_blank(), # switch off major gridlines
    panel.grid.minor = element_blank(), # switch off minor gridlines
    legend.position = 'none', # manually position the legend (numbers being from 0,0 at bottom left of whole plot to 1,1 at top right)
    legend.title = element_blank(), # switch off the legend title
    legend.text = element_blank(),
    legend.key.size = unit(1.5, "lines"),
    legend.key = element_blank(), # switch off the rectangle around symbols in the legend
    panel.border=element_blank(),
    axis.line=element_line(size=0.3)
  )

plot(f3)

使用 position_dodge(witdt = 0.7) 生成的示例图

使用 position_dodge(witdt = 5) 生成的示例图,这两个图完全相同..

任何帮助将不胜感激!谢谢,

4

1 回答 1

2

position_dodge当您在一个位置有多个条时使用,例如如果您在"a"“变量”轴上绘制了多个条。例如,参见以下示例?position_dodge

ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs))) +
  geom_bar(position="dodge")

这里,x 轴由 定义cyl,但填充颜色由 定义vs,因此我们将在每个 x 位置有多个由填充颜色区分的条。位置闪避表示将条形图彼此相邻放置(而不是彼此顶部position = "identity"或堆叠position = "stack")。

每个位置只有一个条,所以position_dodge什么都不做。完全摆脱你的position_dodge,并使用geom_bar(你已经设置为 0.6)的宽度参数。

这是一个很好的可重现示例,但我鼓励您将来尽量减少 Stack Overflow问题。您的所有theme呼叫都与问题无关,尽管加载了 5 个包,但您实际使用的唯一一个是ggplot2. 下面是一些精简的代码。我删除了position_dodge所讨论的,摆脱了你scale_x_continuous,因为它没有改变默认值,我移动了fill内部aes()并添加了scale_fill_manual--- 这正是我喜欢的风格,我摆脱了主题自定义作为它的 16对问题的清晰度无关紧要的代码行。

f3 = ggplot(data = Data,
            aes(x = variables, y = values,
                group = variables, fill = variables)) + 
    geom_bar(stat = 'identity',
             width = 0.6) +       ## adjust this width
    coord_flip() +
    geom_errorbar(aes(ymin = values - std, ymax = values + std),
                  width = .2, size = 0.3) +
    scale_y_continuous("Variable Importance",
                       expand = c(0,0),
                       limits = c(0, 1.1),
                       breaks = seq(0, 1.1, by = 0.1)) +
    scale_fill_manual(values = c('#FF7F0E','#2CA02C','#D62728', '#00008B', '#B23AEE'),
                      guide = FALSE) +
    theme_bw()

f3

作为调整宽度的示例(尽管这是过度绘制而不是替换,因此如果您想让宽度更小,请编辑原始 f3 定义)。

f3 + geom_bar(stat = "identity", width = 0.9)

另外两个注意事项:

  1. 您的大多数主题修改似乎都是重复的theme_classic()--- 这也是内置于ggplot2. 使用theme_classic()而不是theme_bw()可以让你开始更接近你的目标。

    f3 + theme_classic()
    
  2. 正如 Roman 在评论中指出的那样,geom_pointrange可能更适合这些数据。条形顶部的置信区间通常很难查看和比较。这是一个例子:

    ggplot(data = Data,
           aes(x = variables, y = values, color = variables)) + 
      geom_pointrange(aes(ymin = values - std, ymax = values + std), size = 1) +
      scale_y_continuous("Variable Importance",
                         expand = c(0,0),
                         limits = c(0, 1.1),
                         breaks = seq(0, 1.1, by = 0.1)) +
      scale_color_manual(values = c('#FF7F0E','#2CA02C','#D62728', '#00008B', '#B23AEE'),
                         guide = FALSE) +
      coord_flip() +
      theme_classic()
    

    在此处输入图像描述

于 2015-08-28T16:01:59.483 回答