R ggplot, как использовать оттенки одного цвета на сгруппированных барплотах? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь построить график сгруппированного столбца, где ось X содержит различные состояния, и в каждом состоянии у меня есть значения для зимы, весны, лета и падения.По сути, на оси х у меня есть 5 состояний, и каждый этап - это группа столбцов, а внутри каждого кластера - 4 столбца, по одному на каждую из зимы, весны, лета и осени.

Iхочу изменить цвет 4 варов в каждом кластере, чтобы они были разных оттенков одного цвета.Скажем, я выбираю синий цвет, я хочу, чтобы зима была самым темным оттенком синего и падала до самого светлого оттенка синего.Я также хочу, чтобы код был гибким, чтобы он мог вместить более 4 значений в каждом кластере.

Вот код, с которым я работаю

# fill = different categories within a group
# x = grouping vars
# y = value (height of bar)
xvar = rlang::sym('states') #grouping var
yvar = rlang::sym('pct_aware')
xlabel = ('state')
ylabel = ('% of respondents')
graphtitle = 'awareness by segmentation'

ylim_max = 100

withingroupvar = rlang::sym('seasons')
legendtitle = "seasons"

p <- ggplot(data = graphinput, aes(x = factor(!!xvar, levels = jobboards), y = !!yvar,
                                   fill = factor(!!withingroupvar, levels =segorder_text))) 
p + geom_bar(stat = "identity",
             position = position_dodge(0.9)) +
  labs(x = xlabel, y = ylabel) +
  ggtitle(graphtitle) +
  geom_text(aes(label=round(!!yvar,0)), vjust=-0.6, color="black",
            position = position_dodge(0.9), size=4) + 
  scale_fill_manual(name = legendtitle, 
                    values = c('winter'="pink", 'spring' = "aquamarine", 'summer' = "lightblue", 'fall' = "salmon1"),
                    breaks=segorder_text) +
  theme(text = element_text(size = 15))  + ylim(0,ylim_max)

Сейчас яручное назначение значений цвета для каждого из 4 сезонов.Я хотел бы, чтобы это было автоматически - мне нужно только выбрать базовый цвет, а R назначит разные оттенки одного и того же цвета для каждого из сезонов.

Как мне изменить свой код, чтобы добиться этого?

1 Ответ

0 голосов
/ 25 ноября 2018

Я бы определил цветовую палитру

#define color palette
color_palette <- colorRampPalette(colors = c("steelblue", "darkblue"))(length(segorder_text));

, и я бы сослался на эту цветовую палитру в scale_fill_manual.

... scale_fill_manual(name = legendtitle, values = color_palette) + ...

Тогда ваш код будет выглядеть так:

# fill = different categories within a group
# x = grouping vars
# y = value (height of bar)
xvar = rlang::sym('states') #grouping var
yvar = rlang::sym('pct_aware')
xlabel = ('state')
ylabel = ('% of respondents')
graphtitle = 'awareness by segmentation'

ylim_max = 100

withingroupvar = rlang::sym('seasons')
legendtitle = "seasons"

#define color palette
color_palette <- colorRampPalette(colors = c("steelblue", "darkblue"))(length(segorder_text));

p <- ggplot(data = graphinput, aes(x = factor(!!xvar, levels = jobboards), y = !!yvar,
                                   fill = factor(!!withingroupvar, levels =segorder_text))) 
p + geom_bar(stat = "identity",
             position = position_dodge(0.9)) +
  labs(x = xlabel, y = ylabel) +
  ggtitle(graphtitle) +
  geom_text(aes(label=round(!!yvar,0)), vjust=-0.6, color="black",
            position = position_dodge(0.9), size=4) + 
  scale_fill_manual(name = legendtitle, values = color_palette) +
  theme(text = element_text(size = 15))  + ylim(0,ylim_max)
...