Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot2-如何按值而不是字母顺序重新排列带有标签的堆叠条形图数据点_R_Ggplot2_Forcats - Fatal编程技术网

R ggplot2-如何按值而不是字母顺序重新排列带有标签的堆叠条形图数据点

R ggplot2-如何按值而不是字母顺序重新排列带有标签的堆叠条形图数据点,r,ggplot2,forcats,R,Ggplot2,Forcats,我想对堆叠的条形图数据点进行重新排序,以便在每个条形图中,它们按照其总值而不是字母顺序从最大到最小进行排序 我使用fct_reorder(注释掉的行)生成数据,并对数据点进行排序,但标签不遵循更改的顺序。 我怎样才能使标签上的标签跟上,并位于正确的位置在酒吧段的中间? 这是我的工作可复制的例子,fct_重新排序行被注释掉了。如果取消注释,数据点将被排序,但标签将保留在错误的位置 library(tidyverse) library(scales) data<- tibble::trib

我想对堆叠的条形图数据点进行重新排序,以便在每个条形图中,它们按照其总值而不是字母顺序从最大到最小进行排序

我使用fct_reorder(注释掉的行)生成数据,并对数据点进行排序,但标签不遵循更改的顺序。 我怎样才能使标签上的标签跟上,并位于正确的位置在酒吧段的中间?

这是我的工作可复制的例子,fct_重新排序行被注释掉了。如果取消注释,数据点将被排序,但标签将保留在错误的位置

library(tidyverse)
library(scales)


data<- tibble::tribble(
  ~CUSTOMER, ~COMPETITOR, ~VALUE,
      "AAA",    "XXX",  23400,
      "AAA",    "YYY",  10000,
      "AAA",    "ZZZ",  80000,
      "AAA",    "YYY",  60000,
      "BBB",    "XXX",  10000,
      "BBB",    "YYY",  20000,
      "BBB",    "ZZZ",  10000,
      "BBB",    "YYY",  80000,
      "CCC",    "YYY",  30000,
      "CCC",    "ZZZ",  20000,
      "DDD",    "YYY",   7000,
      "CCC",    "VVV",  10000
  )


unit_mln <-
  scales::unit_format(
    unit = "mln",
    sep = " ",
    scale = 1e-6,
    digits = 2,
    justify = "right"
  )

col_competitors <-
  scale_fill_manual( "legend", 
                     values = c(
                       "XXX" = "navyblue",   "YYY" = "red",
                       "ZZZ" = "lightyellow", "VVV" = "green"))



df_cust<- data %>% mutate(COMPETITOR=as.factor(COMPETITOR)) %>% 
  group_by(CUSTOMER) %>%                                                    
  mutate(CUST_VALUE=sum(VALUE)) %>%                                 
  ungroup() %>% 
  group_by(COMPETITOR) %>%      
  mutate(COMP_VALUE=sum(VALUE)) %>%                                 
  ungroup() %>% 
  group_by(CUSTOMER,  COMPETITOR) %>%                                           
  summarise(CUST_VALUE=max(CUST_VALUE), COMP_VALUE=max(COMP_VALUE), VALUE=sum(VALUE))%>% 
  arrange(desc(CUST_VALUE))

# df_cust<-df_cust %>% mutate(COMPETITOR= fct_reorder(COMPETITOR, -COMP_VALUE))



df_comp<- data %>% group_by(COMPETITOR) %>% summarise(VALUE=sum(VALUE)) 

df_cust$CUSTOMER = str_wrap(df_cust$CUSTOMER, width = 30)



plt_main<-df_cust %>% 
  ggplot(aes(x = fct_reorder(CUSTOMER, -CUST_VALUE), y = VALUE)) +
  geom_col(
    aes(fill = COMPETITOR),
    alpha = 0.5,
    position = position_stack(reverse = T),
    col = "darkgray",
    show.legend = F ) +
  geom_text(aes(label = unit_mln(round(VALUE,-4))),
            size = 3,
            position = position_stack(vjust = 0.5)) +
  xlab(" ") + ylab("Market share (GROSS PLN)") + ggtitle(paste("Top competitors in top customers: ", "Poland")) +
  theme_bw(base_size = 11) +
  theme(
    axis.text.x = element_text(
      angle = 90,
      hjust = 1,
      vjust = 0.5 ),
    legend.position = c(0.94, 0.75)) +
  col_competitors +
  scale_y_continuous(
    labels = function(n) {
      unit_mln(n)
    },
    sec.axis = sec_axis(~ . / sum(df$VALUE), labels = scales::percent)
  )
库(tidyverse)
图书馆(比例尺)
数据%
解组()%>%
组别(竞争对手)%>%
变异(复合值=总和(值))%>%
解组()%>%
分组依据(客户、竞争对手)%>%
汇总(CUST_值=最大值(CUST_值),COMP_值=最大值(COMP_值),值=总和(值))%>%
安排(说明(客户价值))
#df_客户百分比变化(竞争对手=fct_再订购(竞争对手,-竞争价值))
df_comp%集团_by(竞争对手)%>%总结(价值=总和(价值))
df_cust$CUSTOMER=str_wrap(df_cust$CUSTOMER,宽度=30)
plt_main%
ggplot(aes(x=fct\U再订购(客户,-CUST\U值,y=值))+
geom_col(
aes(填充=竞争对手),
α=0.5,
位置=位置\u堆栈(反向=T),
col=“darkgray”,
show.legend=F)+
几何文字(aes(标签=单位长度(四舍五入(值,-4))),
尺寸=3,
位置=位置\堆栈(vjust=0.5))+
xlab(“”+ylab(“市场份额(总PLN)”)+ggtitle(粘贴(“顶级客户中的顶级竞争对手:”,“波兰”))+
主题宽度(基本尺寸=11)+
主题(
axis.text.x=元素\文本(
角度=90,
hjust=1,
vjust=0.5),
图例.位置=c(0.94,0.75))+
col_竞争对手+
连续缩放(
标签=函数(n){
单位编号(n)
},
秒轴=秒轴(~./和(df$值),标签=刻度::百分比)
)

我认为应该采取以下措施:

ggplot(df, aes(x = reorder(CUSTOMER, -COMP_VALUE), y = VALUE))
这将按COMP_值对CUSTOMER列进行排序

我对“#*****description****”行进行了注释,这些行使数据点和标签在堆叠条形图中排序成为可能。 现在,它们是按竞争对手的总销售额而不是按字母顺序订购的。 我承认我是通过反复试验才做到这一点的,这可能不是最佳答案

library(tidyverse)
library(scales)

# Example data

data<- tibble::tribble(
  ~CUSTOMER, ~COMPETITOR, ~VALUE,
      "AAA",    "XXX",  123400,
      "AAA",    "YYY",  10000,
      "AAA",    "ZZZ",  80000,
      "AAA",    "YYY",  60000,
      "BBB",    "XXX",  110000,
      "BBB",    "YYY",  20000,
      "BBB",    "ZZZ",  10000,
      "BBB",    "YYY",  80000,
      "CCC",    "YYY",  30000,
      "CCC",    "ZZZ",  12000,
      "DDD",    "YYY",   7000,
      "CCC",    "VVV",  10000)

# Format labels with scales package

unit_mln <-
  unit_format(
    unit = "mln",
    sep = " ",
    scale = 1e-6,
    digits = 2,
    justify = "right"
  )

# Set your own colors for competitors

col_competitors <-
  scale_fill_manual( "legend", 
                     values = c(
                       "XXX" = "navyblue",   "YYY" = "red",
                       "ZZZ" = "lightyellow", "VVV" = "green"))


# Generate helper data for ordering: totals for CUSTOMER and COMPETITOR.

df_cust<- data %>% mutate(COMPETITOR=as.factor(COMPETITOR)) %>% 
  group_by(CUSTOMER) %>%                                                    
  mutate(CUST_VALUE=sum(VALUE)) %>%                                 
  ungroup() %>% 
  group_by(COMPETITOR) %>%      
  mutate(COMP_VALUE=sum(VALUE)) %>%                                 
  ungroup() %>% 
  group_by(CUSTOMER,  COMPETITOR) %>%                                           
  summarise(CUST_VALUE=max(CUST_VALUE), COMP_VALUE=max(COMP_VALUE), VALUE=sum(VALUE))%>% 
  arrange(desc(CUST_VALUE))

# Reorder COMPETITOR by total VALUE descening                       #***this is needed to reorder labels***
df_cust<-df_cust %>% mutate(COMPETITOR= reorder(COMPETITOR, -COMP_VALUE))


# Prepare data for a small "legend" plot
df_comp<- data %>% group_by(COMPETITOR) %>% summarise(VALUE=sum(VALUE)) 

# Wrap CUSTOMER names if too long
df_cust$CUSTOMER = str_wrap(df_cust$CUSTOMER, width = 30)

# Main plot
(
plt_main<-df_cust %>% 
  ggplot(aes(x = fct_reorder(CUSTOMER, -CUST_VALUE), y = VALUE)) +  #***this fct_ reorders bars***
  geom_col(
    aes(fill = COMPETITOR),
    alpha = 0.5,
    position = position_stack(reverse = T),
    col = "darkgray",
    show.legend = F ) +
  geom_text(aes(label = unit_mln(round(VALUE,-4)), 
                group=fct_reorder(COMPETITOR, COMP_VALUE)),         #***this fct_ reorders labels***
            size = 3, 
            position = position_stack(vjust = 0.5, reverse=F)) +
  xlab(" ") + ylab("Market share (GROSS PLN)") + ggtitle(paste("Top competitors in top customers: ", "Poland")) +
  theme_bw(base_size = 11) +
  theme(
    axis.text.x = element_text(
      angle = 90,
      hjust = 1,
      vjust = 0.5 ),
    legend.position = c(0.94, 0.75)) +
  col_competitors +
  scale_y_continuous(
    labels = function(n) {
      unit_mln(n)
    },
    sec.axis = sec_axis(~ . / sum(df_cust$VALUE), labels = scales::percent)
  )
)
库(tidyverse)
图书馆(比例尺)
#示例数据
数据%
解组()%>%
组别(竞争对手)%>%
变异(复合值=总和(值))%>%
解组()%>%
分组依据(客户、竞争对手)%>%
汇总(CUST_值=最大值(CUST_值),COMP_值=最大值(COMP_值),值=总和(值))%>%
安排(说明(客户价值))
#按总价值排序重新排序竞争对手#***这是重新排序标签所必需的***
df_客户百分比变化(竞争对手=重新订购(竞争对手,-竞争价值))
#为小“图例”绘图准备数据
df_comp%集团_by(竞争对手)%>%总结(价值=总和(价值))
#如果客户名称过长,请将其换行
df_cust$CUSTOMER=str_wrap(df_cust$CUSTOMER,宽度=30)
#主要情节
(
plt_main%
ggplot(aes(x=fct_重新排序(客户,-CUST_值),y=值))+#***此fct_重新排序条***
geom_col(
aes(填充=竞争对手),
α=0.5,
位置=位置\u堆栈(反向=T),
col=“darkgray”,
show.legend=F)+
几何文字(aes(标签=单位长度(四舍五入(值,-4)),
组=fct_重新排序(竞争对手,公司价值)),#***此fct_重新排序标签***
尺寸=3,
位置=位置\u堆栈(vjust=0.5,反向=F))+
xlab(“”+ylab(“市场份额(总PLN)”)+ggtitle(粘贴(“顶级客户中的顶级竞争对手:”,“波兰”))+
主题宽度(基本尺寸=11)+
主题(
axis.text.x=元素\文本(
角度=90,
hjust=1,
vjust=0.5),
图例.位置=c(0.94,0.75))+
col_竞争对手+
连续缩放(
标签=函数(n){
单位编号(n)
},
秒轴=秒轴(~./和(df_cust$值),标签=刻度::百分比)
)
)

感谢您的帮助,但不幸的是,它不起作用。条形图按总值降序排列,问题是条形图内的顺序。如果更改,标签将不遵循新的顺序。您是否尝试使用所示的
美学?这可能涉及到根据排序变量创建一个新的“order”变量。我想我已经通过反复尝试重新排序因子成功了。我会把答案贴上去,希望能对你有所帮助,或者有人会详细说明。很高兴你能想出一些办法。仅供参考,我认为如果你给出一个最小的可复制的例子,你可能会得到更多的关注。由于您的绘图数据集非常小,您可以使用
dput
您正在绘制的摘要数据集(跳过所有数据操作),然后提供基本的绘图代码(只有几何图形;无主题、无比例、无标签),以便人们可以轻松查看并帮助解决问题。