2016-01-13 4 views
6

Я попытался добавить небольшую сводную таблицу к сюжету, который я создал с помощью ggplot2::ggplot(). Таблица добавляется через gridExtra::tableGrob() в сохраненный объект ggplot.Добавление таблицы в ggplot с gridExtra и annotation_custom() изменяет пределы оси y

Моя проблема заключается в том, что это, похоже, меняет пределы y моего первоначального сюжета. Есть ли способ избежать этого, не указывая снова пределы через ylim()?

Вот минимальный пример задачи с использованием набора данных 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: Я просто понял, что это, кажется, проблема с stat_summary(). Когда я использую другой геом/слой, тогда ограничения остаются такими же, как и в исходном сюжете. Другой пример, что:

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

Я не уверен в проблеме, но я не думаю, что это проблема с 'stat_summary', которую вы делаете' plot2 + stat_summary (fun.data = "mean_cl_boot", size = 1, alpha = .5) + annotation_custom (sum_table) ', тогда ваш илим сохраняется. – George

+0

Это интересно. Он задает y-пределы для всего диапазона данных, а не из 'geom = 'pointrange'' (который используется' stat_summary' по умолчанию). Поэтому, если я правильно это вижу, в моем первом примере ylim настраивается на диапазон суммированных и отображаемых значений (из 'pointrange'), но при добавлении' annotation_custom' он снова использует диапазон всех данных. – abel

ответ

4

Y-диапазон для Plot1 отличается от Plot2, причины в том, что annotation_custom берет свою эстетику от первоначального aes утверждения, а не модифицированный кадра данных, используемого stat_summary() , Чтобы y-диапазоны для двух графиков были одинаковыми (или примерно одинаковыми - см. Ниже), остановите annotation_custom, получив свою эстетику от исходных данных. То есть, переместите aes() внутри 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

Кстати, причина, по которой два участка не дадут точно такой же у-диапазон из-за начальной загрузки функции в stat_summary(). Действительно, график p1 неоднократно, и вы можете заметить небольшие изменения в y-диапазоне. Или проверьте диапазоны y в данных сборки.

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

Напомним, что ggplot не не оценивает функции до рисования времени - каждый раз, когда Р1 или Р2 втягивается, выбран новый образец начальной загрузки.

Смежные вопросы