768 Stimmen

Wie können wir Diagramme im Stil von Xkcd erstellen?

Offenbar haben die Leute herausgefunden, wie man xkcd Stil-Grafiken in Mathematica y in LaTeX . Können wir das in R machen? Ggplot2-er? Ein geom_xkcd und/oder theme_xkcd?

Ich schätze, in der Basisgrafik ist par(xkcd=TRUE)? Wie mache ich das?

xkcd#1064

Ein erster Versuch (und wie unten viel eleganter gezeigt) in ggplot2 ist das Hinzufügen des Jitter-Arguments zu einer Linie, um einen tollen handgezeichneten Look zu erzielen. So -

ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) + 
  geom_line(position="jitter", color="red", size=2) + theme_bw()

Das ist ein schönes Beispiel - aber die Achsen und die Schriftarten scheinen schwieriger zu sein. Die Schriftarten scheinen jedoch gelöst zu sein (siehe unten). Ist die einzige Möglichkeit, mit Achsen umzugehen, sie auszublenden und sie von Hand einzuzeichnen? Gibt es eine elegantere Lösung? Kann insbesondere in ggplot2 element_line im neuen Themensystem so modifiziert werden, dass es ein Jitter-ähnliches Argument akzeptiert?

468voto

Das folgende Paket könnte für Sie interessant sein:

Paket xkcd : Plotten von ggplot2-Grafiken im XKCD-Stil.

library(xkcd)
vignette("xkcd-intro")

Einige Beispiele (Streudiagramme, Balkendiagramme):

  • Streudiagramm:

Scatterplot

  • Balkendiagramm:

Bar Chart

233voto

Mark Bulling Punkte 2239

Da ich in die gleiche Richtung denke wie einige der anderen Antworten, habe ich das Diagramm "ent-ggplottet" und auch die Flexibilität der x-Achsen-Beschriftungspositionen (was in xkcd üblich zu sein scheint) und eine beliebige Beschriftung des Diagramms hinzugefügt.

Beachten Sie, dass ich einige Probleme mit dem Laden der Schrift Humor Sans hatte und sie manuell in das Arbeitsverzeichnis heruntergeladen habe.

enter image description here

Und der Code...

library(ggplot2)
library(extrafont)

### Already have read in fonts (see previous answer on how to do this)
loadfonts()

### Set up the trial dataset 
data <- NULL
data$x <- seq(1, 10, 0.1)
data$y1 <- sin(data$x)
data$y2 <- cos(data$x)
data$xaxis <- -1.5

data <- as.data.frame(data)

### XKCD theme
theme_xkcd <- theme(
    panel.background = element_rect(fill="white"), 
    axis.ticks = element_line(colour=NA),
    panel.grid = element_line(colour="white"),
    axis.text.y = element_text(colour=NA), 
    axis.text.x = element_text(colour="black"),
    text = element_text(size=16, family="Humor Sans")
    )

 ### Plot the chart
 p <- ggplot(data=data, aes(x=x, y=y1))+
      geom_line(aes(y=y2), position="jitter")+
      geom_line(colour="white", size=3, position="jitter")+
      geom_line(colour="red", size=1, position="jitter")+
      geom_text(family="Humor Sans", x=6, y=-1.2, label="A SIN AND COS CURVE")+
      geom_line(aes(y=xaxis), position = position_jitter(h = 0.005), colour="black")+
      scale_x_continuous(breaks=c(2, 5, 6, 9), 
      labels = c("YARD", "STEPS", "DOOR", "INSIDE"))+labs(x="", y="")+
      theme_xkcd

ggsave("xkcd_ggplot.jpg", plot=p, width=8, height=5)

196voto

user295691 Punkte 6938

Grundlegende Funktion zum Zeichnen von Linien:

xkcd_line <- function(x, y, color) {
  len <- length(x);
  rg <- par("usr");
  yjitter <- (rg[4] - rg[3]) / 1000;
  xjitter <- (rg[2] - rg[1]) / 1000;
  x_mod <- x + rnorm(len) * xjitter;
  y_mod <- y + rnorm(len) * yjitter;
  lines(x_mod, y_mod, col='white', lwd=10);
  lines(x_mod, y_mod, col=color, lwd=5);
}

Grundlegende Achse:

xkcd_axis <- function() {
  rg <- par("usr");
  yaxis <- 1:100 / 100 * (rg[4] - rg[3]) + rg[3];
  xaxis <- 1:100 / 100 * (rg[2] - rg[1]) + rg[1];
  xkcd_line(1:100 * 0 + rg[1] + (rg[2]-rg[1])/100, yaxis,'black')
  xkcd_line(xaxis, 1:100 * 0 + rg[3] + (rg[4]-rg[3])/100, 'black')
}

Und Beispielcode:

data <- data.frame(x=1:100)
data$one <- exp(-((data$x - 50)/10)^2)
data$two <- sin(data$x/10)
plot.new()
plot.window(
    c(min(data$x),max(data$x)),
    c(min(c(data$one,data$two)),max(c(data$one,data$two))))
xkcd_axis()
xkcd_line(data$x, data$one, 'red')
xkcd_line(data$x, data$two, 'blue')

Produziert:

Example chart

145voto

Ben Bolker Punkte 190239

Hier ist ein Versuch über die Schriftarten, basierend auf Links aus den xkcd-Foren und der extrafont Paket:

Wie bereits erwähnt, gibt es eine Forumsdiskussion über Schriftarten auf der xkcd-Seite : Ich habe die erste genommen, die ich finden konnte, vielleicht gibt es noch andere (bessere?) Optionen (@jebyrnes hat in den Kommentaren oben eine weitere Quelle für mögliche Schriftarten angegeben -- die TTF-Datei ist aquí jemand einen 404-Fehler für diese Quelle gemeldet hat, können Sie alternativ versuchen aquí o aquí und ersetzen diese URLs entsprechend durch xkcdFontURL unten; möglicherweise müssen Sie sich etwas mehr anstrengen, um die auf Github geposteten Links zu finden)

   xkcdFontURL <- "http://simonsoftware.se/other/xkcd.ttf"
   download.file(xkcdFontURL,dest="xkcd.ttf",mode="wb")

(Dies ist für den schnellen, einmaligen Gebrauch gedacht: für den regelmäßigen Gebrauch sollten Sie sie in einem Standard-Systemschriftartenverzeichnis ablegen).

   library(extrafont)

Die nützlichsten Informationen über Schriftarten waren auf der extrafont github Seite -- dies ist von dort übernommen

font_import(".")   ## because we downloaded to working directory
loadfonts()

Beispiel mehr oder weniger wortwörtlich von der Github-Seite übernommen:

library(ggplot2)
p <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16, family="xkcd"))

ggsave("xkcd_ggplot.pdf", plot=p,  width=4, height=4)
## needed for Windows:
##   Sys.setenv(R_GSCMD = "C:/Program Files/gs/gs9.05/bin/gswin32c.exe")
embed_fonts("xkcd_ggplot.pdf")

enter image description here

34voto

d2a2d Punkte 1086

Ich habe einen analytischen Kalender im Stil von Xkcd mit RStudio entworfen. Hier ist ein Beispiel für ein Balkendiagramm im Xkcd-Stil

  • Verwendete Schriftart = HumorSans.ttf [Link siehe oben]
  • Verwendetes Paket [xkcd]

Um dieses Diagramm zu erstellen Bar plot proxy for 'Dangers at Work'

Hier ist der verwendete Code

#using packages xkcd, ggplot 
library(xkcd)
library(ggplot2)
font_import(pattern="[H/h]umor")
loadfonts()

### Set up the trial dataset 
d1 <- data.frame('type'=c('DROWNING','RADIATION','TOILET',"ELECTRICAL",'NOISE','PANTRY','YOUR    FALLING ON OBJECTS','OBJECTS FALLING ON YOU','BOSS','FIRE','TRAVEL TO WORK'),'score'=c(2,2,3,6,6,6,11,14,21,26,30))

# we will keep adding layers on plot p. first the bar plot
p <- NULL
p <- ggplot() + xkcdrect(aes(xmin = type-0.1,xmax= type+0.1,ymin=0,ymax =score),
                     d1,fill= "#D55E00", colour= "#D55E00")  +
     geom_text(data=d1,aes(x=type,y=score+2.5,label=score,ymax=0),family="Humor Sans") +   coord_flip()

#hand drawn axes
d1long <- NULL
d1long <- rbind(c(0,-2),d1,c(12,32))
d1long$xaxis <- -1
d1long$yaxis <- 11.75

# drawing jagged axes
p <- p + geom_line(data=d1long,aes(x=type,y=jitter(xaxis)),size=1)
p <- p + geom_line(data=d1long,aes(x=yaxis,y=score), size=1) 

# draw axis ticks and labels
p <- p +  scale_x_continuous(breaks=seq(1,11,by=1),labels = data$Type) +
     scale_y_continuous(breaks=NULL)

#writing stuff on the graph
t1 <- "GOOGLE RESULTS"
p <- p + annotate('text',family="Humor Sans", x=12.5, y=12, label=t1, size=6) 

# XKCD theme
p <- p + theme(panel.background = element_rect(fill="white"),
           panel.grid = element_line(colour="white"),axis.text.x = element_blank(), 
           axis.text.y = element_text(colour="black"),text = element_text(size=18, family="Humor   Sans") ,panel.grid.major = element_blank(),panel.grid.minor = element_blank(),panel.border = element_blank(),axis.title.y = element_blank(),axis.title.x = element_blank(),axis.ticks = element_blank())

print(p)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X