如何在双Y轴ggplot中使用构面

我一直在尝试从此处扩展场景以利用构面(尤其是facet_grid())。


我已经看到了这个例子,但是我似乎无法得到它为我的工作geom_bar()和geom_point()组合。我尝试使用示例中的代码,只是从更改为facet_wrap,facet_grid这似乎也使得第一层未显示。


我是网格和杂项方面的新手,因此,如果有人可以给出一些指导,使P1在y轴左方显示,P2在y轴右方显示,那会很棒。


数据


library(ggplot2)

library(gtable)

library(grid)

library(data.table)

library(scales)


grid.newpage()


dt.diamonds <- as.data.table(diamonds)


d1 <- dt.diamonds[,list(revenue = sum(price),

                        stones = length(price)),

                  by=c("clarity","cut")]


setkey(d1, clarity,cut)

p1和p2


p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill=cut)) +

  geom_bar(stat="identity") +

  labs(x="clarity", y="revenue") +

  facet_grid(. ~ cut) +

  scale_y_continuous(labels=dollar, expand=c(0,0)) + 

  theme(axis.text.x = element_text(angle = 90, hjust = 1),

        axis.text.y = element_text(colour="#4B92DB"), 

        legend.position="bottom")


p2 <- ggplot(d1, aes(x=clarity, y=stones, colour="red")) +

  geom_point(size=6) + 

  labs(x="", y="number of stones") + expand_limits(y=0) +

  scale_y_continuous(labels=comma, expand=c(0,0)) +

  scale_colour_manual(name = '',values =c("red","green"), labels = c("Number of Stones"))+

  facet_grid(. ~ cut) +

  theme(axis.text.y = element_text(colour = "red")) +

  theme(panel.background = element_rect(fill = NA),

        panel.grid.major = element_blank(),

        panel.grid.minor = element_blank(),

        panel.border = element_rect(fill=NA,colour="grey50"),

        legend.position="bottom")

尝试组合(基于上面链接的示例) 这在第一个for循环中失败,我怀疑对geom_point.points进行了硬编码,但是我不知道如何使其适合我的图表(或者足够灵活以适合各种


小怪兽爱吃肉
浏览 966回答 3
3回答

慕尼黑5688855

现在ggplot2有了辅助轴支持,这在许多(但不是全部)情况下变得容易得多。无需杂项操作。即使只允许对相同数据进行简单的线性变换(例如,不同的测量范围),我们也可以首先手动重新缩放其中一个变量,至少可以从该属性中获得更多收益。library(tidyverse)max_stones <- max(d1$stones)max_revenue <- max(d1$revenue)d2 <- gather(d1, 'var', 'val', stones:revenue) %>%&nbsp;&nbsp; mutate(val = if_else(var == 'revenue', as.double(val), val / (max_stones / max_revenue)))ggplot(mapping = aes(clarity, val)) +&nbsp; geom_bar(aes(fill = cut), filter(d2, var == 'revenue'), stat = 'identity') +&nbsp; geom_point(data = filter(d2, var == 'stones'), col = 'red') +&nbsp; facet_grid(~cut) +&nbsp; scale_y_continuous(sec.axis = sec_axis(trans = ~ . * (max_stones / max_revenue),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name = 'number of stones'),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;labels = dollar) +&nbsp; theme(axis.text.x = element_text(angle = 90, hjust = 1),&nbsp; &nbsp; &nbsp; &nbsp; axis.text.y = element_text(color = "#4B92DB"),&nbsp; &nbsp; &nbsp; &nbsp; axis.text.y.right = element_text(color = "red"),&nbsp; &nbsp; &nbsp; &nbsp; legend.position="bottom") +&nbsp; ylab('revenue')它也可以很好地与facet_wrap:其他并发症,例如scales = 'free'和space = 'free'也很容易做到。唯一的限制是,对于所有构面,两个轴之间的关系均相等。

天涯尽头无女友

我认为对于一定范围的数据集(例如diamonds),它scales = 'free'会起作用,但是我尝试使用该样本集来反映我的一些真实世界数据的样本集,但我无法y-left适当缩放。有什么想法吗?d1 <- data.table(Group = c(rep("A", 4), rep("B", 4)), xaxis = c("a","b","c","d"), yleft = c(100,90,50,40, 40,35,30,10), yright = c(.2,.08,.02,.02, .25,.1,.03,.02))
打开App,查看更多内容
随时随地看视频慕课网APP