ggplot2 条形图,每个 x 数据值和两个 y 轴有两个条形图

ggplot2 bar chart with two bars for each x value of data and two y-axis

我努力创建一个条形图,其中包含两个不同的 y 轴和每个 x 值(类别)的两个条形图。 我有不同类型的数据类别(见下文),每个类别我都有两个要并排绘制的值(pricenumber)。但是,每个类别的值相距甚远,这使得 number 类别的条形图几乎看不见。因此,我想添加第二个 y 轴(一个用于 price,一个用于 number)以允许在两个类别之间进行比较。

示例数据:

 Cat Type        Value
1 A  price        12745
2 A  number           5
3 B  price     34874368
4 B  number         143
5 C  price        84526
6 C  number          11

我使用以下 R 代码 (ggplot2) 来创建绘图:

plot = ggplot(df ,aes(x=Cat, fill=Type, y=Value))+
  geom_bar(stat="identity", position="dodge")+
  theme_bw() +
  labs_pubr() +
  scale_fill_grey() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
plot

scale_y_continuoussec.axis 但我没有设法将 y 轴分配给数据类型。

  scale_y_continuous(
    "price", 
    sec.axis = sec_axis(~., name = "number")
  ) +

我对每一个提示都很高兴:)

我理解的想法是按类型拆分图表,您可以使用有用的 ggplot facet_wrap() verb 来完成此操作。然后使用 scales 包修复沿 y 轴的舍入。

library(scales)
library(ggplot)
library(dplyr)

tbl <- tibble(Cat = c("A", "A", "B", "B", "C", "C"),  Type = c("price", "number", "price", "number","price", "number")
              , Value = c(12745, 5, 34874368, 143, 84526, 11))

tbl %>%
  ggplot(aes(Cat, Value, fill = Cat)) + 
  geom_col(position = "dodge") + 
  facet_wrap(~Type, scales = "free") + 
  scale_y_continuous(labels = scales::number_format())

你是这个意思吗?

df=tribble(
~Id, ~Cat, ~Type, ~Value,
1, "A", "price", 13,
2, "A", "number", 5,
3, "B", "price", 19,
4, "B", "number", 12,
5, "C", "price", 8,
6, "C", "number", 11)

df %>% ggplot(aes(Cat))


df %>% ggplot(aes(x=Type, fill=Type, y=Value))+
  geom_col()+
  facet_grid(~Cat)

P.S。 我稍微更改了您的值,因为当差异大约为 10 ^ 7!

时您看不到太多

对于这些数字,对数标度更适合

df=tribble(
  ~Id, ~Cat, ~Type, ~Value,
  1, "A", "price", 12745,
  2, "A", "number", 5,
  3, "B", "price", 34874368,
  4, "B", "number", 143,
  5, "C", "price", 84526,
  6, "C", "number", 11)

df %>% ggplot(aes(x=Type, fill=Type, y=Value))+
  geom_col()+
  scale_y_continuous(trans='log10')+
  facet_grid(~Cat)