2015-08-27 5 views
1

Я пытаюсь уменьшить расстояние между барами уже, однако position_dodge, похоже, не работает при настройке расстояния между полосками.ggplot geom_bar с 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) 

sample plot generated with position_dodge(witdt = 0.7)

sample plot generated with position_dodge(witdt = 5), these two plots are exactly identical..

Любая помощь будет принята с благодарностью! Спасибо,

+2

Я хотел бы предложить 'geom_pointrange' для представления такого рода данных. –

+0

Почему у вас есть аргумент 'width = 0.6' в' geom_bar() ', это без: http://prntscr.com/89m3ah – user2673238

+0

@Gregor Ответ на ваш вопрос на самом деле. Возможно, это может быть ответ? – tonytonov

ответ

1

используется, когда у вас несколько баров в одном положении, например, если у вас было несколько баров, нанесенных на "a" на оси «Переменные». Смотрите, например, пример из ?position_dodge:

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

Здесь ось й определяются cyl, но цвет заливки определяется vs, так что мы будем иметь несколько баров, отличающихся цветами заливки в каждой точке х должность. Позиция dodge говорит, чтобы положить бары рядом друг с другом (в отличие друг от друга position = "identity" или уложены в position = "stack").

У вас есть только отдельные бары в каждом положении, поэтому position_dodge ничего не делает. Избавьтесь от своего position_dodge целиком и используйте аргумент width geom_bar (который вы уже установили в 0.6).

Это был хороший воспроизводимый пример, но я бы посоветовал вам сделать ваши вопросы о переполнении стека более минимальным в будущем. Все вызовы 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 

В качестве примера регулировки ширины (хотя это overplotting не замена, поэтому, если вы хотите, чтобы ширина меньше редактировать исходное определение f3).

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

Две другие ноты:

  1. Большинство ваших модификаций темы, как представляется, дублируя theme_classic() --- который также встроен в ggplot2. Использование theme_classic() вместо theme_bw() может позволить вам начать гораздо ближе к вашей цели.

    f3 + theme_classic() 
    
  2. Как Роман отметил в комментариях, 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() 
    

    enter image description here

+0

Благодарим вас за подробное объяснение. Это очень полезно! – user32147