Ik wil de plot direct hieronder reproduceren door ggplot2 te gebruiken. Ik kan dichtbij komen, maar kan de boven- en rechterranden niet verwijderen. Hieronder presenteer ik verschillende pogingen met behulp van ggplot2, inclusief verschillende suggesties die op of via Stackoverflow zijn gevonden. Helaas heb ik die suggesties niet kunnen laten werken.
Ik hoop dat iemand een of meer van de onderstaande codefragmenten kan corrigeren.
Bedankt voor eventuele suggesties.
# 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())
Antwoord 1, autoriteit 100%
BEWERKENNegeer dit antwoord. Er zijn nu betere antwoorden. Zie de opmerkingen. Gebruik + theme_classic()
BEWERKEN
Dit is een betere versie. De bug die hieronder in het oorspronkelijke bericht wordt genoemd, blijft (denk ik). Maar de aslijn wordt onder het paneel getekend. Verwijder daarom zowel de panel.border
als panel.background
om de aslijnen te zien.
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())
Originele post
Dit komt in de buurt. Er is een fout opgetreden waarbij axis.line
niet werkte op de y-as (zie hier), dat lijkt nog niet te zijn opgelost. Daarom moet na het verwijderen van de paneelrand de y-as apart worden ingetekend met 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
De extreme punten worden afgekapt, maar het uitknippen kan ongedaan worden gemaakt met behulp van code door baptiste.
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)
Of gebruik limits
om de grenzen van het paneel te verplaatsen.
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)
Antwoord 2, autoriteit 51%
Recente updates voor ggplot (0.9.2+) hebben de syntaxis voor thema’s herzien. Het meest opvallende is dat opts()
nu is verouderd en is vervangen door theme()
. Sandy’s-antwoord genereert nog steeds (vanaf januari ’12) een grafiek, maar zorgt ervoor dat R een aantal waarschuwingen geeft .
Hier is de bijgewerkte code die de huidige ggplot-syntaxis weerspiegelt:
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'))
genereert:
Antwoord 3, autoriteit 17%
Een alternatief voor theme_classic()
is het thema dat wordt geleverd met het cowplotpakket, theme_cowplot()
(automatisch geladen met het pakket). Het lijkt op theme_classic()
, met een paar subtiele verschillen. Het belangrijkste is dat de standaard labelgroottes groter zijn, zodat de resulterende cijfers kunnen worden gebruikt in publicaties zonder dat verdere aanpassingen nodig zijn (in het bijzonder als u ze opslaat met save_plot()
in plaats van ggsave()
). Ook is de achtergrond transparant, niet wit, wat handig kan zijn als je de figuur in illustrator wilt bewerken. Ten slotte zien gefacetteerde plots er naar mijn mening beter uit.
Voorbeeld:
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
Zo ziet het bestand plot.png
geproduceerd door deze code eruit:
Disclaimer: ik ben de auteur van het pakket.
Antwoord 4, autoriteit 5%
Ik volgde Andrew’s antwoord, maar ik moest ook https://stackoverflow.com/a/35833548en stel de x- en y-assen afzonderlijk in vanwege een bug in mijn versie van ggplot (v2.1.0).
In plaats van
theme(axis.line = element_line(color = 'black'))
Ik gebruikte
theme(axis.line.x = element_line(color="black", size = 2),
axis.line.y = element_line(color="black", size = 2))
Antwoord 5, autoriteit 2%
De bovenstaande opties werken niet voor kaarten die zijn gemaakt met sf
en geom_sf()
. Daarom wil ik hier de relevante parameter ndiscr
toevoegen. Dit zorgt voor een mooie, schone kaart met alleen de functies.
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
Antwoord 6
Vereenvoudiging van het bovenstaande antwoord van Andrew leidt tot dit hoofdthema om de halve rand te genereren.
theme (panel.border = element_blank(),
axis.line = element_line(color='black'))
Antwoord 7
Hier is een uiterst eenvoudig antwoord
yourPlot +
theme(
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")
)
Zo eenvoudig is het. Bron: het einde van ditartikel