当前位置: 首页 > 知识库问答 >
问题:

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

楚承天
2023-03-14

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

示例数据:

 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秒轴,但我没有设法将y轴分配给数据类型。

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

我很高兴每一个提示:)

共有2个答案

周健
2023-03-14

我的理解是按类型拆分图形,您可以使用有用的ggplot facet_wrap()动词来执行此操作。然后使用比例包沿 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())
胡玉书
2023-03-14

这是你的意思吗?

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)

我稍微改变了一下你的值,因为当差异在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)
 类似资料:
  • 我试图理解他们条形图上的ChartJS文档。这对我来说没有意义,因为顶部的标签在一次意义上看起来似乎只适用于第一个栏(基于颜色),在另一种意义上,它适用于整个图表(它是唯一一个不在工具提示中的标签,它位于前面和中间) 我一直在努力使它更像他们的折线图,它显示了一个带有标签的图例和一个与图表上每条线相关的彩色正方形。(他们没有多行图表的示例,但它确实是这样工作的)。 我希望在顶部有一个图例,表示浅绿

  • 关于我的图表,我有以下问题/疑问: > 如何防止正确的 y 轴刻度值被部分删除或进入图表内部? 当我使用yValuesTripId作为左和右y轴域的域时,图表绘制得很好。如何使用yAxisFirstStopTimes作为左y轴域值和yAxisLastStopTimes作为右y轴值使其绘制精细? 您可以单击此处查看或编辑图表: 代码如下:

  • 问题内容: 需要查看条形图中的条形所代表的确切值,而不是Y轴上的近似值。 怎么可能呢? 谢谢阅读! 问题答案: 在iReport 3.7.6中,您可以仅选中BarPlot属性下的“显示标签”框。 在以前的版本(3.1.4)中,我必须创建一个ChartCustomizer类。 如果您需要格式化标签中的数字(例如,设置为百分比,添加千位分隔符等),那么即使在新版本中,您也绝对需要一个ChartCust

  • 我创建了一个水平条形图w/chart.js,需要在y轴上创建两组标签,但只能创建一个。 例如,参见下图,在y轴上,我有一组单词“other”和“paper ”,计数分别为2和3;在这个分组和下面的两个分组中,我还需要显示与这两个词相关的月份——比如五月。 有办法做到这一点吗? 附言:在附加的图像中,我将镜像设置为true,但如果解决方案能给我所需的输出,我愿意关闭镜像。 到目前为止,我已经查看了这

  • 现在有两个列表值,如下所示: 和x标签: 我想绘制基于相同x标签的不同颜色的lst1和lst2条。 我尝试的代码: 但有错误: attribute error:“none type”对象没有属性“seq”