R 如何对图表和图例中的条形图重新排序

R 如何对图表和图例中的条形图重新排序,r,R,我正努力按照数据结构(SD、MB、FI、FO、NP)对绘图和图例中的条形图重新排序。 这是我的数据 Data <- tibble::tribble( ~Year, ~SD, ~MB, ~FI, ~FO, ~NP, "2010", 41, 36.7, 10.2, 5.3, 6.8, "2011", 49.1, 50.9, NA,

我正努力按照数据结构(SD、MB、FI、FO、NP)对绘图和图例中的条形图重新排序。 这是我的数据

    Data <- tibble::tribble(
  ~Year,    ~SD,    ~MB,      ~FI,       ~FO,       ~NP,
  "2010",   41,     36.7,    10.2,        5.3,     6.8,
  "2011",   49.1,   50.9,    NA,          NA,      NA,
  "2012",   41.1,   32.4,    11.4,        8.6,     6.4,
  "2013",   38.9,   29.6,    10,          13.7,    7.7,
  "2014",   38.8,   36.5,    5.2,         10.4,    9,
  "2015",   43.4,   39.1,    NA,          11.9,    5.5, 
  "2016",   40.6,   38,      10.5,        8.8,     2.2,
  "2017",   38.3,   42.3,    9.7,         6.8,     2.9,
  "2018",   37.8,   40.3,    9.3,         10.6,    2,
  "2019",   33.8,   41.6,    8.1,         14.2,    2.3
先谢谢你

下面是对代码的编辑:

csv文件位于此处:

Rtutorial%
突变(名称=因子(名称,级别=c('Total'),
“黑貂羚羊”,
“猴子”,
“青蛙和芦苇巴克”,
“狐狸和豺狼”,
“侧条纹豺狼”
))) %>%
ggplot(aes(x=as.factor(Year),y=value,fill=name,reorder(TRUE)))+
连续缩放(标签=缩放::逗号格式())+
ylab(“总人口”)+
xlab(“年度”)+
实验室(fill=“Legend”)+
几何图形栏(stat=“identity”,position=“dodge”)+
主题(经典)+
主题(strip.placement=“外部”,
panel.grid.major=元素_blank(),
panel.grid.minor=元素_blank(),
panel.border=元素_blank(),
legend.position=“right”,
axis.text.x=元素\文本(角度=0,vjust=0))+
比例尺(调色板=“绿色”,名称=“图例”,标签=c('Total
种群','貂羚羊','猴子','青蛙和苇鹿','狐狸和羚羊'
豺狼',“侧条纹豺狼”,订购(T))+
主题(legend.position=“right”,axis.text.x=元素\文本(角度=
90,vjust=0.4)
我在运行代码时仍然会出错,我尝试查看了几个有关stackoverflow的示例,但看不出问题出在哪里

我得到的一个错误是factor-name中的错误。

如果你把这一行放进去:

  mutate(name = factor(name, levels=c("SD","MB","FI","FO","NP"))) %>%
在您的
pivot\u(一年)
功能之后,它应该可以工作。这将使变量
name
成为一个按您所需的级别排序的因子

Data %>%
  pivot_longer(-Year) %>% 
  mutate(name = factor(name, levels=c("SD","MB","FI","FO","NP"))) %>%
  ggplot(aes(x = Year, y = value, fill = name, reorder(TRUE))) +  ylab("Students") +
  xlab("Year") +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ Year, scales = 'free_x', ncol = 10, strip.position = "bottom") +
  theme_minimal() +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()+
          theme(strip.placement  = "outside",
                panel.spacing    = unit(0, "points"),
                axis.title.x=element_blank(),
                axis.text.x=element_blank(),
                axis.ticks.x=element_blank(),
                strip.background = element_blank(),
                strip.background.y = element_blank(),
                panel.background = element_rect(fill = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                panel.border = element_blank(), 
                strip.text       = element_text(face = "bold", size = 9)) +
          scale_fill_continuous(name = "Legend", label = c("SD","MB","FI","FO","NP", ordered(TRUE))) + 
          theme(legend.position = "right", axis.text.x = element_text(angle = 90,vjust = 0.4)))


编辑-回答下面的评论

您可以稍微简化该函数,如下所示:

Data <- tibble::tribble(
  ~Year,    ~`Sable-Antelope`,    ~`Monkey`,      ~`Frogs and reed buck`,       ~`Fox and jackals`,       ~`Side striped jackal`,
  "2010",   41,     36.7,    10.2,        5.3,     6.8,
  "2011",   49.1,   50.9,    NA,          NA,      NA,
  "2012",   41.1,   32.4,    11.4,        8.6,     6.4,
  "2013",   38.9,   29.6,    10,          13.7,    7.7,
  "2014",   38.8,   36.5,    5.2,         10.4,    9,
  "2015",   43.4,   39.1,    NA,          11.9,    5.5, 
  "2016",   40.6,   38,      10.5,        8.8,     2.2,
  "2017",   38.3,   42.3,    9.7,         6.8,     2.9,
  "2018",   37.8,   40.3,    9.3,         10.6,    2,
  "2019",   33.8,   41.6,    8.1,         14.2,    2.3)


Data %>%
  pivot_longer(-Year) %>% 
  mutate(name = factor(name, levels=c("Sable-Antelope",
                                      "Monkey",
                                      "Frogs and reed buck",
                                      "Fox and jackals",
                                      "Side striped jackal"))) %>%
  ggplot(aes(x = Year, y = value, fill = name)) +  
  ylab("Students") +
  xlab("Year") +
  labs(fill="Legend") + 
  geom_bar(stat = "identity", position = "dodge") +
  scale_fill_brewer(palette="Greens") +  
  theme_minimal() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank() ,
    legend.position = "right", 
    axis.text.x = element_text(angle = 0, vjust = 7.5))```

这很有帮助,谢谢@DaveArmstrong。但是,如何将颜色更改为绿色,并将图例标记为图例而不是名称?效果很好,但当我将列标题更改为数据(即名称)时会出错。我想将列标题从~SD、~MB、~FI、~FO、~NP更改为~Sable羚羊、~Monkey、~Frogs和reed buck,~z~狐狸和豺狼,~侧面条纹jackal@MisBlearnsR-再次编辑以使用所需的变量名称。诀窍在于,对于包含空格或其他特殊字符的名称,您需要将它们括在后面的记号中-
`
。但是,当我运行以csv格式保存的导入数据时,我很难获得正确的绘图。
Data %>%
  pivot_longer(-Year) %>% 
  mutate(name = factor(name, levels=c("SD","MB","FI","FO","NP"))) %>%
  ggplot(aes(x = Year, y = value, fill = name, reorder(TRUE))) +  ylab("Students") +
  xlab("Year") +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ Year, scales = 'free_x', ncol = 10, strip.position = "bottom") +
  theme_minimal() +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()+
          theme(strip.placement  = "outside",
                panel.spacing    = unit(0, "points"),
                axis.title.x=element_blank(),
                axis.text.x=element_blank(),
                axis.ticks.x=element_blank(),
                strip.background = element_blank(),
                strip.background.y = element_blank(),
                panel.background = element_rect(fill = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                panel.border = element_blank(), 
                strip.text       = element_text(face = "bold", size = 9)) +
          scale_fill_continuous(name = "Legend", label = c("SD","MB","FI","FO","NP", ordered(TRUE))) + 
          theme(legend.position = "right", axis.text.x = element_text(angle = 90,vjust = 0.4)))
Data <- tibble::tribble(
  ~Year,    ~`Sable-Antelope`,    ~`Monkey`,      ~`Frogs and reed buck`,       ~`Fox and jackals`,       ~`Side striped jackal`,
  "2010",   41,     36.7,    10.2,        5.3,     6.8,
  "2011",   49.1,   50.9,    NA,          NA,      NA,
  "2012",   41.1,   32.4,    11.4,        8.6,     6.4,
  "2013",   38.9,   29.6,    10,          13.7,    7.7,
  "2014",   38.8,   36.5,    5.2,         10.4,    9,
  "2015",   43.4,   39.1,    NA,          11.9,    5.5, 
  "2016",   40.6,   38,      10.5,        8.8,     2.2,
  "2017",   38.3,   42.3,    9.7,         6.8,     2.9,
  "2018",   37.8,   40.3,    9.3,         10.6,    2,
  "2019",   33.8,   41.6,    8.1,         14.2,    2.3)


Data %>%
  pivot_longer(-Year) %>% 
  mutate(name = factor(name, levels=c("Sable-Antelope",
                                      "Monkey",
                                      "Frogs and reed buck",
                                      "Fox and jackals",
                                      "Side striped jackal"))) %>%
  ggplot(aes(x = Year, y = value, fill = name)) +  
  ylab("Students") +
  xlab("Year") +
  labs(fill="Legend") + 
  geom_bar(stat = "identity", position = "dodge") +
  scale_fill_brewer(palette="Greens") +  
  theme_minimal() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank() ,
    legend.position = "right", 
    axis.text.x = element_text(angle = 0, vjust = 7.5))```
Rtutorial %>%
  
  pivot_longer(c(-Year)) %>%
  
  mutate(name = factor(name, levels=c('Total',
                                       'Sable.Antelope',
                                       'Monkey',
                                       'Frogs.and.reed.buck',
                                       'Fox.and.jackals',
                                       'Side.striped.jackal'), 
                             labels=c('Total',
                                      'Sable-Antelope',
                                      'Monkey',
                                      'Frogs and reed buck',
                                      'Fox and jackals',
                                      'Side striped jackal'))) %>%
  
  ggplot(aes(x=as.factor(Year), y=value, fill=name, reorder(TRUE))) +
  scale_y_continuous(labels = scales::comma_format()) +
  ylab("Total Population") +
  xlab("Year") +
  labs(fill="Legend") + 
  geom_bar(stat = "identity", position = "dodge") +
  theme_classic() +
  theme(strip.placement  = "outside",
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank() ,
        legend.position = "right", 
        axis.text.x = element_text(angle = 90,vjust = 0.4)) +
  scale_fill_brewer(palette = "Greens", name = "Legend")