如何自定义双轴Barchart?

发布于 2025-02-04 13:23:16 字数 1420 浏览 3 评论 0原文

这是此 r:如何使用多个条和双轴构建Barplot?

我有1个CAT和3个数值变量的DF。现在,我想知道如何按“成本”的大小从右到左订购栏(由红线给出)。在我想手动指定每个条形的颜色之后,但找不到道路。另外,是否可以将这些数字(成本)放入框中?

df <- data.frame (model  = c("A", "B", "C","D","E","F"),
                  share = c(12,20,15,9,60,20),
                  sale = c(16,25,18,14,67,28),
                  cost = c(14,19,28,24,57,28))

df_long <- df %>% 
  pivot_longer(
    cols = -model
  )



ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 0.5)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_text(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

This is a follow-up question of this R: How to build barplot with multiple bars and dual axis?

I have df with 1 cat and 3 numerical variables. Now I would like to know how to order bar descending from the right to left by size of 'cost' (which is given by red line). After I want to specify the colour of every bars manually myself, but could not find the way. Also, is it possible to put this numbers (costs) in boxes?

df <- data.frame (model  = c("A", "B", "C","D","E","F"),
                  share = c(12,20,15,9,60,20),
                  sale = c(16,25,18,14,67,28),
                  cost = c(14,19,28,24,57,28))

df_long <- df %>% 
  pivot_longer(
    cols = -model
  )



ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 0.5)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_text(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

治碍 2025-02-11 13:23:16

模型 的顺序可以通过设置因子的级别来完成。更改geom_text to geom_label创建的框而不是纯粹显示文本。我不确定您的意思是“。我自己手动指定每个酒吧的颜色”。你是说填充吗?颜色现在由您的因子确定,可以通过scale_fill_manual更改,但是您已经这样做了。

#data
df <- data.frame (model  = c("A", "B", "C","D","E","F"),
                  share = c(12,20,15,9,60,20),
                  sale = c(16,25,18,14,67,28),
                  cost = c(14,19,28,24,57,28))

#set levels of model by cost
df$model <- factor(df$model, levels = arrange(df, desc(df$cost))$model)

#set to long format
df_long <- df %>% 
  pivot_longer(
    cols = -model
  )

#plot (changed geom_text to geom_label)
ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 0.5)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

The order of model by cost can be done by setting the levels of the factor. Changing geom_text to geom_label created boxes instead of purely displaying the text. I am not sure what you mean with ". Specify the colour of every bars manually myself". Do you mean the fill? The color is now determined by your factor and can be changed by scale_fill_manual, but you already do that.

#data
df <- data.frame (model  = c("A", "B", "C","D","E","F"),
                  share = c(12,20,15,9,60,20),
                  sale = c(16,25,18,14,67,28),
                  cost = c(14,19,28,24,57,28))

#set levels of model by cost
df$model <- factor(df$model, levels = arrange(df, desc(df$cost))$model)

#set to long format
df_long <- df %>% 
  pivot_longer(
    cols = -model
  )

#plot (changed geom_text to geom_label)
ggplot(df_long, aes(x = model, y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 0.5)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

image

绅士风度i 2025-02-11 13:23:16

更新:用您喜欢的颜色定义向量,然后使用scale_fill_identity


colors <- c("black","blue","black","green","black","orange",
            "black","pink","black", "yellow", "black","green")

library(tidyverse)

df_long <- df %>% 
  pivot_longer(
    cols = -model
  ) 


ggplot(df_long, aes(x = fct_reorder(model,desc(value)), y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=colors), position = position_dodge())+
  scale_fill_identity()+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 1)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-1.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

“在此处输入图像说明”

第一个答案:
我们可以从forcats软件包中使用fct_reorder,它在tidyverse

library(tidyverse)

df_long <- df %>% 
  pivot_longer(
    cols = -model
  ) 


ggplot(df_long, aes(x = fct_reorder(model, desc(value)), y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 1)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

Update: Define a vector with colors you like and then use scale_fill_identity:


colors <- c("black","blue","black","green","black","orange",
            "black","pink","black", "yellow", "black","green")

library(tidyverse)

df_long <- df %>% 
  pivot_longer(
    cols = -model
  ) 


ggplot(df_long, aes(x = fct_reorder(model,desc(value)), y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=colors), position = position_dodge())+
  scale_fill_identity()+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 1)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-1.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

First answer:
We could use fct_reorder from forcats package it is in tidyverse

library(tidyverse)

df_long <- df %>% 
  pivot_longer(
    cols = -model
  ) 


ggplot(df_long, aes(x = fct_reorder(model, desc(value)), y= value, label=value))+
  geom_col(data = filter(df_long, name != "cost"), aes(fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(color = name, group = 1), size = 1)+
  scale_color_manual(values = "red")+
  geom_point(data = filter(df_long, name == "cost"), size = 2)+
  geom_label(data = filter(df_long, name == "cost"), hjust=0, vjust=-0.5)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文