R - ggplot - 将大量图表放入一个屏幕

时间:2017-06-20 00:33:33

标签: r plot ggplot2

我有汽车数据框(n个品牌的注册年数在2个不同时期内测量)。我想分析价格变化的动态,所以我试图创建一个折线图(x =年,y =两个价格序列)每个品牌的图表。

# data frame example

brand=sort(rep(paste(letters[1:26]),16))
data_date  = rep(seq(as.Date("2017/5/1"), by = "month", length.out = 2 ),208)
category = rep(c(1,2),208)   
cars = data.frame(brand, data_date, category)
cars = cars[order(cars$brand,  cars$data_date, cars$category),]
year = rep(rep(seq(as.Date("2010/1/1"), by = "year", length.out = 8 ),2),26)
cars = cbind(cars, year, price= abs(rnorm(416))*10)
View(cars)


我使用ggplot和facet_wrap以及facet_grid创建了一个图表,但图表几乎无法读取。 我试图使用包gridExtra和grid.arrange函数,但这给了我一个我无法解决的错误。 另一种替代多时隙不适用于R版本3.3.3

有人可以解释为什么grid.arrange在这里不起作用吗?
(同一张图表打印次数)
有没有更好的方法可以在一个屏幕上获取所有图表?

有我的尝试:

load(ggplot2)

# plot 1

ggplot(data=cars , aes(x=cars$year  , y=cars$price,
                            group=interaction(cars$brand, cars$data_date),
                            fill=interaction(cars$brand, cars$data_date),
                            color =interaction(cars$brand, cars$data_date)))+
  geom_line()+  geom_point() +
  #facet_grid(.~cars$brand)
  facet_wrap(~cars$brand, ncol=2)


# plot 2 using loop

car_brands = levels(cars$brand)
p_list=list(0)

for (i in 1:26) {

  plot_data = cars[(cars$brand==car_brands[i]),]      
  p1 = ggplot(data=plot_data , aes(x=plot_data$year  , y=plot_data$price,
                                group=interaction(plot_data$brand, plot_data$data_date),
                                fill=interaction(plot_data$brand,plot_data$data_date),
                               color =interaction(plot_data$brand,plot_data$data_date)))+
    geom_line()+  geom_point() +
    facet_grid(.~plot_data$brand)+
      ggtitle(car_brands[i])

  p_list[[i]] = p1

  }

library(gridExtra)
grid.arrange(p_list, ncol=2)

Error in gList(list(list(data = list(brand = c(1L, 1L, 1L, 1L, 1L, 1L,  : 
  only 'grobs' allowed in "gList"



更新

grid.arrange(grobs=p_list, ncol=2)

解决了错误,但循环方法仍存在两个问题:

1。图表仍然难以阅读
2.正在打印相同的图表次数(循环的问题是什么?我无法弄清楚它为什么不起作用)

 有没有更好的方法来创建这个任务?

2 个答案:

答案 0 :(得分:1)

考虑by而不是for循环,因为它将指定因子的数据帧切割为数据帧列表,以用于ggplot等任何所需操作。同时考虑减少图形数量以提高可读性,甚至调整图例和轴如下所示:

p_list <- by(cars, cars$brand, function(b) {    
  brand_date <- interaction(b$brand, b$data_date)

  p <- ggplot(data=b, aes(x=b$year, y=b$price,
                     group = brand_date,
                     fill = brand_date,
                     color = brand_date)) +
    geom_line() + geom_point() + 
    facet_grid(.~b$brand) + labs(x="Year", y="Price") +
    theme(legend.position="bottom") +
    ggtitle(max(as.character(b$brand)))

})

# VERY LARGE PLOT
grid.arrange(grobs=p_list, ncol=2)

# FIRST 6 GRAPHS FOR BETTER READABILITY
grid.arrange(grobs=p_list[1:6], ncol=2)

Car Brands Multiple Plot Output

答案 1 :(得分:0)

我在2.循环方法中发现了错误 需要var sharedApplication = utils.ios.getter(UIApplication, UIApplication.sharedApplication); var overlay = UIView.alloc().initWithFrame({ origin : { x: 0, y: 44, }, size: { height: 100, width: platform.screen.mainScreen.widthPixels } }); overlay.backgroundColor = UIColor.blackColor; overlay.alpha = .6; sharedApplication.keyWindow.rootViewController.presentedViewController.cameraOverlayView = overlay; 而不是aes_string()