ggplot2 分面多数据源组合示例

本文介绍如何使用R语言及其ggplot2包来绘制客户商品交易总额(GMV)的趋势图表。通过执行SQL查询获取数据,并利用R进行数据处理与可视化,最终呈现客户GMV随时间变化的趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

library(ggplot2)
source('~/R/odps_common.R')
sql<-c(
' select cust_name_cn,yyyymm as ds,gmv,amplitude,rn
  from icbubi.dwa_en_ftrd_mon_cust_gmv_d 
  where ds=max_pt(\'icbubi.dwa_en_ftrd_mon_cust_gmv_d\') and rn<=100
'
,
'select
  cust_name_cn
  ,max_gmv
  ,min_gmv 
  ,minds
  ,maxds
  ,midds
  ,total_gmv
  ,rn
  ,prod_cn_name
from icbubi.dwa_en_ftrd_mon_cust_gmv_rank_d 
  where ds=max_pt(\'icbubi.dwa_en_ftrd_mon_cust_gmv_rank_d\') and rn<=100
'
,
'
select 
x0.cust_name_cn
,x0.ds
,check_status
,rn
,x1.min_gmv
,x1.max_gmv
,day 
,count(distinct day) over(partition by x0.cust_name_cn ) as days
,row_number() over(partition by x0.cust_name_cn order by day ) as dayrn
,( x1.max_gmv-x1.min_gmv)/30*cast(day as bigint) just2
from 
(
  select distinct 
  cust_name_cn
  ,to_char(gmt_ord_create,\'yyyymm\') as ds
  ,to_char(gmt_ord_create,\'dd\') as day
  ,case when check_status=0 then \'看货失败\' 
  when check_status=1 then \'看货成功\'
  when check_status=2 then \'看货中\'
  when check_status=3 then \'无法看货\'
  end  check_status
  from  icbubi.dwa_en_ftrd_clrc_prod_df
  where ds=max_pt(\'icbubi.dwa_en_ftrd_clrc_prod_df\')
  and check_status in(0,1,2,3)
  )x0 join icbubi.dwa_en_ftrd_mon_cust_gmv_rank_d x1
  on x0.cust_name_cn=x1.cust_name_cn
  where x1.ds=max_pt(\'icbubi.dwa_en_ftrd_mon_cust_gmv_rank_d\'
  )
'
)




d0<-exec_sql(sql[1])
##整体情况
d00<-exec_sql(sql[2])
###监装清苦
d3<-exec_sql(sql[3])
###调整,以免位置交错
b<-as.numeric(d3$ds)


##临时用
fjust<-function(a){
  b<-rep(0,length(a))
  i=1
  for (j in a){ if(j%%2==0) b[i]<-8  else   b[i]<-0;i=i+1} 
  return(b) 
}
####


dx<-d0[as.numeric( d0$rn)<=15,]
dxtotal<-d00[as.numeric(d00$rn)<=15,]
dxcheck<-d3[as.numeric(d3$rn)<=15,]
just<-fjust(as.numeric(dxcheck$ds))
dxcheck<-cbind(dxcheck,just)
px<-ggplot(data=dx,aes(x=ds,y=gmv,group=cust_name_cn))
px<-px+geom_line()+
  facet_wrap(~cust_name_cn,scales='free',ncol=3)+
  geom_point(data=dxtotal,color='red',aes(x=maxds,y=max_gmv,group=cust_name_cn),size=3)+
  geom_text(data=dxtotal,color='red',aes(x=maxds,y=max_gmv,label=paste('最大gmv=',round(max_gmv,1)),group=cust_name_cn,vjust=2,hjust=1.2),family='STKaiti')+
  geom_point(data=dxtotal,color='red',aes(x=minds,y=min_gmv,group=cust_name_cn),size=3)+
  geom_text(data=dxtotal,color='red',size=3,aes(x=minds,y=min_gmv,label=paste('最小gmv=',round(min_gmv,2)),group=cust_name_cn,vjust=-0.6,hjust=0.8),family='STKaiti')+
  ###gmv/2 的意义在于total的值可能会很高,导致图形畸变大,所以位置处理采用/2
  geom_text(data=dxtotal,aes(x=midds,y=(max_gmv-min_gmv)/1.2,label=paste('主要产品:',prod_cn_name),group=cust_name_cn,vjust=0.5,hjust=1),family='STKaiti')+
  geom_text(data=dxtotal,aes(x=midds,y=(max_gmv-min_gmv)/1.2,label=paste('总gmv=',round(total_gmv,1)),group=cust_name_cn,vjust=3,hjust=1),family='STKaiti')+
  ##看货
  geom_point(data=dxcheck,aes(x=ds,y=min_gmv+(max_gmv-min_gmv)/(as.numeric(days)+1)*as.numeric( dayrn),color=check_status),shape=10,size=3)+
  geom_text(data=dxcheck,aes(x=ds,y=min_gmv+(max_gmv-min_gmv)/(as.numeric(days)+1)*as.numeric( dayrn),label=day,group=cust_name_cn,hjust=2),size=3,family='STKaiti')+
  labs(x='日期-月份',y='gmv-万美元',title='客户gmv趋势')+
  theme_classic()+
  theme(
    text=element_text(family="STKaiti",size=6)
    ,title=element_text(family="STKaiti",size=5)
    ,plot.title=element_text(size=15,face='bold')
    ,axis.title=element_text(size=15)
    ,axis.text.x=element_text(angle = 30,size=9)
    ,axis.text.y=element_text(size=9)
    ,strip.text=element_text(size=10)
    ,legend.text=element_text(size=10)
  )


px


##ggsave('A.png',width = 1000,height = 1500,limitsize = FALSE)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值