ggplot2 条形图,每个 x 数据值和两个 y 轴有两个条形图
ggplot2 bar chart with two bars for each x value of data and two y-axis
我努力创建一个条形图,其中包含两个不同的 y 轴和每个 x 值(类别)的两个条形图。
我有不同类型的数据类别(见下文),每个类别我都有两个要并排绘制的值(price
和 number
)。但是,每个类别的值相距甚远,这使得 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_continuous
和 sec.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)
我努力创建一个条形图,其中包含两个不同的 y 轴和每个 x 值(类别)的两个条形图。
我有不同类型的数据类别(见下文),每个类别我都有两个要并排绘制的值(price
和 number
)。但是,每个类别的值相距甚远,这使得 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_continuous
和 sec.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)