2015-12-29 5 views
1

Я пытался рисовать два графика, используя библиотеку ggplot R в RStudio. Проблема в том, что, когда я рисую два в пределах одной функции, отображается только последний (в представлении «Графики» RStudio), а первый исчезает. Хуже того, когда я запускаю ggsave() после каждого графика - который сохраняет их в файл - ни один из них не отображается (но файлы сохраняются, как ожидалось). Тем не менее, я хочу посмотреть, что я сохранил на сюжетах, как это было раньше.Ggplot не показывает графики в исходной функции

Есть ли способ, который я могу отображать, что я буду строить в RTSudio's участки посмотреть, а также сохранить их? Более того, когда графики не сохраняются, почему проблема отображения возникает, когда имеется более одного сюжета? (то есть, почему он показывает последний, но не тот, который был раньше?)

Код с рисунками ниже. Я удалил некоторые части, потому что они кажутся ненужными (но могут добавлять их, если они действительно актуальны).

HHIplot = ggplot(pergame) 
# some ggplot geoms and misc. here 
ggsave(paste("HHI Index of all games,",year,"Finals.png"), 
    path = plotpath, width = 6, height = 4) 

HHIAvePlot = ggplot(AveHHI, aes(x = AveHHI$n_brokers)) 
# some ggplot geoms and misc. here 
ggsave(paste("Average HHI Index of all games,",year,"Finals.png"), 
    path = plotpath, width = 6, height = 4) 

Я уже взглянули here и here но и не помогли. Добавление print(HHIplot) или print(HHIAvePlot) после строк ggsave() не отображает график.

Большое спасибо заранее.


Update 1: Решение, предлагаемое ниже не работает, хотя она работает для образца кода ответа на вызов в. Я передал объекты ggplot в .Globalenv, а print() дал мне пустой серый квадрат на участке (я думаю, это пустой объект ggplot без слоев). Я думаю, что проблема может быть в некоторых слоях или манипуляторах, которые я использовал, поэтому я привел полный код для одного объекта ggplot ниже. Есть предположения? (Примечание: я пытался поставить assign() линию во всех возможных местах по отношению к ggsave() и ggplot().)

HHIplot = ggplot(pergame) 
HHIplot + 
    geom_point(aes(x = pergame$n_brokers, y = pergame$HHI)) + 
    scale_y_continuous(limits = c(0,10000)) + 
    scale_x_discrete(breaks = gameSizes) + 
    labs(title = paste("HHI Index of all games,",year,"Finals"), 
     x = "Game Size", y = "Herfindahl-Hirschman Index") + 
    theme(text = element_text(size=15),axis.text.x = element_text(angle = 0, hjust = 1)) 
assign("HHIplot",HHIplot, envir = .GlobalEnv) 
ggsave(paste("HHI Index of all games,",year,"Finals.png"), 
    path = plotpath, width = 6, height = 4) 
+3

Графическая панель графика RStudio имеет две левую/правую стрелки в левом верхнем углу, которые можно использовать для перемещения вперед и назад в истории графиков, напечатанных на текущем устройстве. – joran

+0

Joran, действительно, это так, и первый сюжет не появляется, когда я делаю это, чтобы посмотреть его.Я часто использую эти стрелки. –

ответ

2

Я предварить это тем, что следующий плохая практика. Считается, что плохая практика нарушает правила определения языка программирования для чего-то столь же тривиального, как это, но вот как это делается в любом случае.

Таким образом, внутри тела вашей функции вы создадите оба графика и поместите их в переменные. Затем вы будете использовать ggsave(), чтобы записать их. Наконец, вы будете использовать assign(), чтобы переместить переменные в глобальную область.

library(ggplot2) 
myFun <- function() { 
    #some sample data that you should be passing into the function via arguments 
    df <- data.frame(x=1:10, y1=1:10, y2=10:1) 
    p1 <- ggplot(df, aes(x=x, y=y1))+geom_point() 
    p2 <- ggplot(df, aes(x=x, y=y2))+geom_point() 
    ggsave('p1.jpg', p1) 
    ggsave('p2.jpg', p2) 
    assign('p1', p1, envir=.GlobalEnv) 
    assign('p2', p2, envir=.GlobalEnv) 
    return() 
} 

Теперь, когда вы запускаете myFun() он запишет свои два участка в .jpg файлов, а также падение графики в вашу глобальную окружающую среду, так что вы можете просто запустить p1 или p2 на консоли, и они будут появятся в области графика RStudio.

еще раз, это плохая практика

Хорошая практика будет не беспокоиться о том, что они не выскакивать в RStudio. Они выписали файлы, и вы знаете, что они это сделали, поэтому посмотрите на них.

+0

Doicomehereoften, большое спасибо за помощь. Было бы слишком много, чтобы спросить, что вы подразумеваете под «правилами определения языка программирования» и почему считается неправильной практикой его нарушить? Я иногда использую 'assign()' для размещения переменных в глобальной среде. –

+0

Обновление: это не сработало. Хотя ваш код работает нормально ('print (p1)' и 'print (p2)' показывает графики как ожидалось), отправка моих ggplots в .Globalenv и запуск 'print()' на них не отображает графики. Я получаю пустой серый экран (я предполагаю, что объект ggplot без слоев передается). Я добавлю еще один код в главный вопрос. –

+0

Не используйте 'print()'. Просто запустите 'p1' или' p2'. Там много написано в других разделах о области, поэтому просто начните искать вещи, страница Википедии по области обзора - хорошее место для начала. Это плохая практика, потому что сама функция ничего не возвращает. Функция должна возвращать нечто вроде файла или значения, которое должно быть помещено в переменную. Функция, которую я написал выше, ничего не возвращает, выписывает два файла и имеет два побочных эффекта, которые не ожидались бы от наивного запуска функции. – doicomehereoften1

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