r - 在ggplot2中的条之间放置刻度线

标签 r ggplot2

使用 diamonds ggplot2中的数据集包,我可以生成以下图表。

library(ggplot2)
library(dplyr)

diamond.summary <- 
  diamonds %>%
  mutate(carat = ifelse(runif(nrow(.)) < 0.05, NA_real_, carat)) %>%
  group_by(carat_quintile = ntile(carat, 5)) %>%
  summarise(avg_price = mean(price))

diamond.summary %>%
  filter(!is.na(carat_quintile)) %>%
  ggplot(aes(carat_quintile, avg_price)) + 
  geom_bar(stat = "identity", 
           color = "black",
           width = 1) + 
  scale_x_continuous("Carat percentile",
                     breaks = 1:6 - 0.5,
                     labels = seq(0,100, by = 20)) + 
  scale_y_continuous(expand = c(0,0),
                     limits = c(0, 1.1* max(diamond.summary$avg_price)))

enter image description here

到目前为止,很容易。但是,我还想在图表旁边显示缺失条目的平均价格。类似于以下内容:
enter image description here
diamond.summary %>%
  mutate(Facet = is.na(carat_quintile),
         carat_quintile_noNA = ifelse(Facet, "Unknown", carat_quintile)) %>%
  ggplot(aes(x = carat_quintile_noNA, y = avg_price, fill = Facet)) + 
  geom_bar(stat = "identity") + 
  facet_grid(~Facet, scales = "free_x", space = "free_x") + 
  scale_x_discrete(breaks = (0:6) - 0.5)

但是,当我尝试使用 scale_x_continuous 执行相同的技巧时,我收到错误 Discrete value supplied to continuous scale .当我尝试使用 scale_x_discrete(breaks = c(0:6 + 0.5))例如,轴刻度和标签消失。

我的问题是,如何获得上面相同的分面图表,其中第一个面板中的刻度线与本文的第一个图表中的一样?关于图表设计的建议可能是一个可以接受的解决方案,但我不认为像这样的所有问题都可以通过重新设计来解决。

最佳答案

诀窍是将您的因子转换为数字,为未知量分配一个魔数(Magic Number)。 ( ggplot2 不会用真实的 NA 值绘制条形图。)然后使用 scale_x_continuous

diamond.summary %>%
  mutate(Facet = is.na(carat_quintile),
         carat_quintile_noNA = ifelse(Facet, "Unknown", carat_quintile),
         ## 
         ## 99 is a magic number.  For our plot, it just has
         ## to be larger than 5. The value 6 would be a natural
         ## choice, but this means that the x tick marks would 
         ## overflow ino the 'unknown' facet.  You could choose
         ## choose 7 to avoid this, but any large number works.  
         ## I used 99 to make it clear that it's magic.
         numeric = ifelse(Facet, 99, carat_quintile)) %>%

  ggplot(aes(x = numeric, y = avg_price, fill = Facet)) + 
  geom_bar(stat = "identity", width = 1) + 
  facet_grid(~Facet, scales = "free_x", space = "free_x") + 
  scale_x_continuous(breaks = c(0:5 + 0.5, 99),
                     labels = c(paste0(c(0:5) * 20, "%"), "Unknown"))

enter image description here

关于r - 在ggplot2中的条之间放置刻度线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937369/

相关文章:

再现 Fisher 线性判别图

r - 如何将 vline 添加到 facet_grid 中的所有图形?

r - ggplot2:更改 facet_grid 图中的 strip.text 位置

r - 在ggplot中调整文本在错误栏上方的位置

r - R中的填充系列

r - 更改 R 中函数的默认参数

r - 使用 ggplot2 绘制彩色编码的世界地图

r - 如何仅更改图例中的几何绘图顺序?

r - 将ggplot2与名称中带有空格的列一起使用

R Shiny : deselect from selectize