Видаліть сітку, колір тла та верхню та праву межі з ggplot2


104

Я б хотів відтворити сюжет безпосередньо нижче за допомогою ggplot2. Я можу підійти близько, але не можу видалити верхню та праву межі. Нижче я представляю кілька спроб використання ggplot2, включаючи кілька пропозицій, знайдених у або через Stackoverflow. На жаль, мені не вдалося змусити цих пропозицій працювати.

Я сподіваюся, що хтось, можливо, зможе виправити один або декілька фрагментів коду нижче.

Дякую за будь-які пропозиції.

# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")


library(ggplot2)

df <- as.data.frame(cbind(a,b))

# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()

# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))

# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)

# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)

# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())

# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))

# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) { 
   structure( 
     function(x = 0, y = 0, width = 1, height = 1, ...) { 
       polylineGrob( 
         x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc", 
         gp=gpar(lwd=size, col=colour, lty=linetype), 
       ) 
     }, 
     class = "theme", 
     type = "box", 
     call = match.call() 
   )
}

ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())

3
як це написано в коментарі нижче, тепер це можна зробити з + theme_classic ()
nsheff

Відповіді:


134

EDIT Ігноруйте цю відповідь. Зараз є кращі відповіді. Дивіться коментарі. Використовуйте+ theme_classic()

EDIT

Це краща версія. Помилка, згадана нижче в оригінальній публікації, залишається (я думаю). Але лінія осі промальована під панеллю. Тому видаліть як panel.borderі, panel.backgroundщоб побачити лінії осі.

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

ggplot(df, aes(x = a, y = b)) + geom_point() +
  theme_bw() +
  theme(axis.line = element_line(colour = "black"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank()) 

введіть тут опис зображення

Оригінальний пост Це наближається. Виникла помилка, яка axis.lineне працює на осі y ( див. Тут ), яка, здається, ще не виправлена. Тому після видалення межі панелі осі y потрібно намалювати окремо, використовуючи geom_vline.

library(ggplot2)
library(grid)

a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p = ggplot(df, aes(x = a, y = b)) + geom_point() +
   scale_y_continuous(expand = c(0,0)) +
   scale_x_continuous(expand = c(0,0)) +
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)
p

Крайні точки вирізані, але відсікання можна скасувати, використовуючи код баптистом .

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

введіть тут опис зображення

Або використовувати limitsдля переміщення меж панелі.

ggplot(df, aes(x = a, y = b)) + geom_point() +
   xlim(0,22) +  ylim(.95, 2.1) +
   scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
   scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +   
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)

Дякуємо за ваше приємне пояснення. Оголошено!
Мохамед Рахома

76

Останні оновлення до ggplot (0.9.2+) змінили синтаксис тем. Найголовніше, що opts()тепер застаріла, замінена на theme(). Відповідь Сенді все ще (станом на січень 12 року) створює діаграму, але змушує R кидати купу попереджень.

Ось оновлений код, що відображає поточний синтаксис ggplot:

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

#base ggplot object
p <- ggplot(df, aes(x = a, y = b))

p +
  #plots the points
  geom_point() +

  #theme with white background
  theme_bw() +

  #eliminates background, gridlines, and chart border
  theme(
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank()
  ) +

  #draws x and y axis line
  theme(axis.line = element_line(color = 'black'))

генерує:

сюжетний вихід


33
чи простіше? ggplot (df, aes (x = a, y = b)) + geom_point () + topic_classic ()
користувач20650

Жоден із цих підходів для мене не працює, використовуючи ggplot2 2.1.0 ... @ відповідь wkretzsch була хорошою.
Нова

25

Альтернативою theme_classic()є тема, яка постачається разом із пакетом коров'ячих трубокtheme_cowplot() (завантажується автоматично разом із пакетом). Це схоже на theme_classic(), з кількома тонкими відмінностями. Найголовніше, що розміри міток за замовчуванням є більшими, тому отримані цифри можна використовувати в публікаціях без додаткових модифікацій (зокрема, якщо ви зберігаєте їх save_plot()замість ggsave()). Також фон прозорий, а не білий, що може бути корисним, якщо ви хочете відредагувати фігуру в ілюстраторі. Нарешті, гранітні сюжети виглядають краще, на мій погляд.

Приклад:

library(cowplot)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p <- ggplot(df, aes(x = a, y = b)) + geom_point()
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme

Ось як виглядає файл, plot.pngстворений цим кодом: введіть тут опис зображення

Відмова: Я автор пакету.


8

Я слідував за відповіддю Ендрю , але мені також довелося дотримуватися https://stackoverflow.com/a/35833548 та встановлювати осі x та y окремо через помилку в моїй версії ggplot (v2.1.0).

Замість

theme(axis.line = element_line(color = 'black'))

я використав

theme(axis.line.x = element_line(color="black", size = 2),
    axis.line.y = element_line(color="black", size = 2))

3

Наведені вище параметри не працюють для карт, створених за допомогою sfта geom_sf(). Отже, я хочу тут додати відповідний ndiscrпараметр. Це створить приємну чисту карту, що показуватиме лише функції.

library(sf)
library(ggplot2)

ggplot() + 
  geom_sf(data = some_shp) + 
  theme_minimal() +                     # white background
  theme(axis.text = element_blank(),    # remove geographic coordinates
        axis.ticks = element_blank()) + # remove ticks
  coord_sf(ndiscr = 0)                  # remove grid in the background

1

Спрощення викладеної вище відповіді Ендрю призводить до цієї ключової теми для генерування половини кордону.

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))

0

Ось надзвичайно проста відповідь

yourPlot +
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
    )

Це так просто. Джерело: кінець цієї статті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.