我正在开发一个绘图函数,它有翻转坐标的选项(使用coord_flip
)。问题是,这是一个分组绘图(使用fill
参数),这意味着,出于某种原因,coord_flip
也会反转颜色、图例、值列和填充列。实际上,这意味着我的函数中有以下代码:
if(flip_coord){
colors = c("#CC0000", "#002D73" ) %>% rev
rev_legend = T
table[[col_plot]] = fct_rev(table[[col_plot]]) # value column
table[['origin_table']] = fct_rev(table[['origin_table']]) # fill column
} else{
colors = c("#CC0000", "#002D73" )
rev_legend = F
}
在我的图中还有这样一行:
{if(flip_coord) coord_flip()} +
这将返回所有其他被coord_flip
扰乱的内容,但不太优雅。有没有更好的方法只翻转坐标而不反转其他内容?
PS:我知道这里没有可复制的例子,我会试着添加一个,但是如果有人已经偶然发现了这个问题的答案,我会暂时发布。
编辑:做了一些reprex
。假设我的数据是:
df = tibble(origin = c('2000s', '1990s') %>% rep(2),
region = c('South', 'North') %>% rep(2) %>% sort,
value = 1:4) %>%
mutate(origin = factor(origin, levels = c('1990s', '2000s')),
region = factor(region, levels = c('North', 'South')))
colors = c('red', 'blue')
# origin region value
# <fct> <fct> <int>
# 1 2000s North 1
# 2 1990s North 2
# 3 2000s South 3
# 4 1990s South 4
如果我有规律地绘图,一切都是有序的(90年代第一,00年代第二,北方第一,南方第二):
df %>%
ggplot(aes(x = region, fill = origin, y = value)) +
geom_bar(stat = "identity", position = 'dodge', color = "white", alpha= 0.8)+
scale_fill_manual(values=colors)
但是,如果我翻转坐标(只是将+ coord_flip()
添加到上面的代码中),我会得到以下内容:
南高于北,00高于90,图例的顺序与条形图的顺序不同。如果输入x = value
和y = origin
,这是完全相同的。因此,要解决这个问题,我必须执行以下操作:
df2 = df
df2[['region']] = fct_rev(df2[['region']]) # Change 1
df2[['origin']] = fct_rev(df2[['origin']]) # Change 2
df2 %>%
ggplot(aes(x = value, fill = origin, y = region)) +
geom_bar(stat = "identity", position = 'dodge', color = "white", alpha= 0.8) +
guides(fill = guide_legend(reverse = T)) + # Change 3
scale_fill_manual(values=rev(colors)) # Change 4
带来正确的订单:
有没有不那么麻烦的方法来实现这一点?
2条答案
按热度按时间gr8qqesn1#
问题是
coord_flip()
更改了分组条形图中组内条形的顺序:根据here,一个解决问题的方法是将position_dodge()的宽度设置为负值,使用
scale_x_discrete(limits=rev)+
,我们可以在正确的位置获得北:lkaoscv72#
坐标翻转并不翻转周围的一切。因子从底部开始绘制。因此,1990年将低于2000年,北方将低于南方。
我能看到的最简单的方法是简单地颠倒你的因子水平。(当创建你的因子时)。