R语言 有没有办法在不反转其他东西的情况下翻转坐标?

ovfsdjhp  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(181)

我正在开发一个绘图函数,它有翻转坐标的选项(使用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 = valuey = 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

带来正确的订单:

有没有不那么麻烦的方法来实现这一点?

gr8qqesn

gr8qqesn1#

问题是coord_flip()更改了分组条形图中组内条形的顺序:根据here,一个解决问题的方法是将position_dodge()的宽度设置为负值,
使用scale_x_discrete(limits=rev)+,我们可以在正确的位置获得北:

library(tidyverse)
df %>% 
  ggplot(aes(x=region, y=value, fill=origin))+
  geom_col(position = position_dodge(), width = -0.4)+
  scale_fill_manual(values = c("red", "blue")) +
  coord_flip()+
  scale_x_discrete(limits=rev)+
  theme_minimal(base_size=16)+
  theme(axis.title.x=element_blank(),
        axis.title.y=element_blank())

lkaoscv7

lkaoscv72#

坐标翻转并不翻转周围的一切。因子从底部开始绘制。因此,1990年将低于2000年,北方将低于南方。
我能看到的最简单的方法是简单地颠倒你的因子水平。(当创建你的因子时)。

library(tidyverse)
df <- tibble(
  origin = c("2000s", "1990s") %>% rep(2),
  region = c("South", "North") %>% rep(2) %>% sort(),
  value = 1:4
) %>%
  mutate(
    ## just reverse the factor levels
    origin = factor(origin, levels = rev(c("1990s", "2000s"))),
    region = factor(region, levels = rev(c("North", "South")))
  )

colors <- c("red", "blue")

df %>%
  # switched x and y
  ggplot(aes(y = region, x = value, fill = origin)) +
  geom_bar(stat = "identity", position = "dodge", color = "white", alpha = 0.8) +
## this is to set the correct legend order and mapping to your colors
  scale_fill_manual(values = colors, breaks = rev(unique(df$origin)))

相关问题