R:如何构建具有多个条形图和双轴的条形图?

标签 r ggplot2 plotly tidyverse data-visualization

我的数据框有 1 个分类变量和 3 个数值变量。我想在plotly R中构建条形图,其中“份额”和“销售”变量将在条形图中给出并反射(reflect)在左侧y轴上,而“成本”变量将按行可视化,单位将反射(reflect)在右侧第二个轴上。此外,条形颜色应根据“型号”列而不同

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))

预期输出( Code ):

enter image description here

最佳答案

更新2:只是为了展示vjust的工作原理:

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 = 2)+
  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=-6)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

更新辅助 y 轴和点的数字:

library(tidyverse)

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 = 2)+
  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)+
  scale_y_continuous(
    name = "Sale and Share",
    sec.axis = sec_axis(~., name ="Cost")
  )+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

第一个答案: 像这样的吗?

  1. 以长格式提供数据

  2. 针对每个条形和线条过滤数据

library(tidyverse)

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


ggplot() +
  geom_col(data = filter(df_long, name != "cost"), aes(x = model, y= value, fill=name), position = position_dodge())+
  scale_fill_manual(values = c("blue", "grey"))+
  geom_line(data = filter(df_long, name == "cost"), aes(x = model, y= value, color=name, group=1), size = 2)+
  geom_point(data = filter(df_long, name == "cost"), aes(x = model, y= value), size = 2)+
  scale_color_manual(values = "red")+
  theme_minimal()+
  theme(legend.title=element_blank())

enter image description here

关于R:如何构建具有多个条形图和双轴的条形图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72487178/

相关文章:

r - R 中的 3d 曲面图与 plotly

r - 将列表元素名称作为变量传递给 lapply 中的函数

r - 计算R中的内核岭回归以进行模型选择

r - 如何在 R 中将默认绘图类型从点更改为线?

r - 如何使用 xlim 或 ylim 停止 ggrepel 重叠点

r - 无需绘图即可扩展轴范围(以便按 x 单位对齐两个图)

html - 在 R markdown 中嵌入 plotly 输出

R绘图条形图正/负值不同颜色第二轴

子集化数据帧中意外输出的原因 - R

r - 使用 ggplot2 对分组数据进行多个 stat_function