2016-01-13 18 views
6

Tôi đã thử thêm một bảng tóm tắt nhỏ vào ô mà tôi đã tạo bằng ggplot2::ggplot(). Bảng được thêm vào thông qua gridExtra::tableGrob() đối tượng ggplot đã lưu.Thêm bảng vào ggplot với gridExtra và chú thích_custom() thay đổi giới hạn trục y

Vấn đề của tôi là điều này dường như thay đổi giới hạn y của bản gốc. Có cách nào để tránh điều đó mà không phải chỉ định lại giới hạn qua ylim() không?

Dưới đây là một ví dụ rất nhỏ cho vấn đề bằng cách sử dụng dữ liệu ChickWeight:

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     stat_summary(fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 
# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot1 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

EDIT: tôi chỉ ra rằng nó có vẻ là một vấn đề với stat_summary(). Khi tôi sử dụng một geom/lớp khác, thì giới hạn ở lại như chúng ở trong cốt truyện ban đầu. Một ví dụ khác cho rằng:

plot2 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     geom_jitter() 
plot2 
plot2 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

+0

Tôi không chắc chắn về vấn đề này, nhưng tôi không nghĩ rằng đó là vấn đề với 'stat_summary' bạn làm' plot2 + stat_summary (fun.data = "mean_cl_boot", size = 1, alpha = .5) + annotation_custom (sum_table) 'thì ylim của bạn được giữ nguyên. – George

+0

Điều đó thật thú vị. Nó đặt giới hạn y cho toàn bộ phạm vi dữ liệu thay vì từ 'geom = 'pointrange'' (mà' stat_summary' sử dụng theo mặc định). Vì vậy, nếu tôi thấy điều đó một cách chính xác, trong ví dụ đầu tiên của tôi ylim được điều chỉnh theo phạm vi của các giá trị tóm tắt và hiển thị (từ 'pointrange'), nhưng khi thêm' annotation_custom', nó sẽ sử dụng lại toàn bộ dữ liệu. – abel

Trả lời

4

y tầm cho plot1 là khác nhau từ plot2, lý do là annotation_custom mất thẩm mỹ của nó từ aes tuyên bố ban đầu, không phải là khung dữ liệu sửa đổi được sử dụng bởi stat_summary() . Để có được phạm vi y cho hai ô giống nhau (hoặc gần giống nhau - xem bên dưới), hãy dừng annotation_custom nhận tính thẩm mỹ của nó từ dữ liệu gốc. Tức là, di chuyển aes() bên trong stat_summary().

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight) + 
     stat_summary(aes(x = Time, y = weight, color = Diet), fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 

# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot2 = plot1 + annotation_custom(sum_table, xmin = 10, xmax = 10, ymin = 200, ymax = 200) 
plot2 

enter image description here

Bằng cách này, lý do hai lô sẽ không cung cấp chính xác giống y Phạm vi đó là vì chức năng bootstrap trong stat_summary(). Thật vậy, âm mưu p1 nhiều lần, và bạn có thể nhận thấy những thay đổi nhỏ trong phạm vi y. Hoặc kiểm tra y-range trong dữ liệu xây dựng.

ggplot_build(plot1)$layout$panel_ranges[[1]]$y.range 
ggplot_build(plot2)$layout$panel_ranges[[1]]$y.range 

Hãy nhớ rằng ggplot không đánh giá chức năng cho đến khi vẽ - mỗi lần vẽ p1 hoặc p2, một mẫu bootstrap mới được chọn.

Các vấn đề liên quan