为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小怪兽爱吃肉 2019-10-10 14:32:45
我一直在尝试从此处扩展场景以利用构面(尤其是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和p2p1 <- 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进行了硬编码,但是我不知道如何使其适合我的图表(或者足够灵活以适合各种
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

现在ggplot2有了辅助轴支持,这在许多(但不是全部)情况下变得容易得多。无需杂项操作。


即使只允许对相同数据进行简单的线性变换(例如,不同的测量范围),我们也可以首先手动重新缩放其中一个变量,至少可以从该属性中获得更多收益。


library(tidyverse)


max_stones <- max(d1$stones)

max_revenue <- max(d1$revenue)


d2 <- gather(d1, 'var', 'val', stones:revenue) %>% 

  mutate(val = if_else(var == 'revenue', as.double(val), val / (max_stones / max_revenue)))


ggplot(mapping = aes(clarity, val)) +

  geom_bar(aes(fill = cut), filter(d2, var == 'revenue'), stat = 'identity') +

  geom_point(data = filter(d2, var == 'stones'), col = 'red') +

  facet_grid(~cut) +

  scale_y_continuous(sec.axis = sec_axis(trans = ~ . * (max_stones / max_revenue),

                                         name = 'number of stones'),

                     labels = dollar) +

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

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

        axis.text.y.right = element_text(color = "red"),

        legend.position="bottom") +

  ylab('revenue')

//img1.sycdn.imooc.com//5d9ed0c700011a4a23651071.jpg

它也可以很好地与facet_wrap


//img1.sycdn.imooc.com//5d9ed0d80001cbde23651531.jpg

其他并发症,例如scales = 'free'space = 'free'也很容易做到。唯一的限制是,对于所有构面,两个轴之间的关系均相等。


查看完整回答
反对 回复 2019-10-10
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我认为对于一定范围的数据集(例如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))

查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 923 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信