Xkcd tarzı grafikleri nasıl yapabiliriz?


697

Görünüşe göre, halk nasıl çözdüklerini xkcd tarzı grafikler Mathematica ve LaTeX'te . R'de yapabilir miyiz? Ggplot2-ers? Bir geom_xkcd ve / veya theme_xkcd?

Sanırım temel grafik, par (xkcd = TRUE)? Nasıl yaparım?

xkcd # 1064

Ggplot2'de bir ilk bıçak (ve aşağıda çok daha zarif bir şekilde gösterilmiştir) olarak, jitter argümanını bir çizgiye eklemek harika bir elle çizilmiş görünüm sağlar. Yani -

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

Güzel bir örnek veriyor - ancak eksenler ve yazı tipleri daha zor görünüyor. Yazı tipleri çözülmüş olarak görünür (aşağıda). Eksenleri boşaltmak ve elle çekmek için tek yol mu? Daha zarif bir çözüm var mı? Özellikle, ggplot2'de, yeni tema sistemindeki element_line titremeye benzer bir argüman alacak şekilde değiştirilebilir mi?


8
xkcd grafiklerinin gerekli unsurları tam olarak ne düşünürdünüz? Ek açıklamalar? keyfi eğriler, eksenler ve ölçekler? elle çizilmiş bir görünüm?
smcg

8
Tüm grafik öğelerinin elle çizilmiş görünümüne ve hissine odaklanacağım: eksenler, metin, çizgiler, vb.
joran

61
Zorunlu fareyi unutma!
Jørgen R

4
Ayrıca, yazı tipleri xkcdsucks.blogspot.com/2009/03/…
jebyrnes

11
R ve xkcd'yi sevdiğim kadar, bu memeyi kim başlattı, başlarını dunk etmeliydi. Bir kalem kullan insanlar!
naught101

Yanıtlar:


424

Aşağıdaki paketi dikkate almak isteyebilirsiniz:

Paket xkcd : ggplot2 grafiklerini XKCD tarzında çizme.

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

Bazı örnekler (Dağılım Grafikleri, Çubuk Grafikler):

  • Dağılım grafiği:

Dağılım grafiği

  • Grafik çubuğu:

Grafik çubuğu


@smillig, Windows r sürümü BeniOku : "İkili paketler, kaynaklar yayınlandıktan yaklaşık 1-3 gün sonra CRAN'da kullanılabilir."
GSee

43
Paketi yayınlarda kullanırken nelere dikkat etmeliyim?
ziggystar

1
+1 Ve harika paket için teşekkürler. Yazı tiplerini yükleme konusunda sorun yaşıyorum ! Giriş dosyasındaki bir düzeltme, (sec-2.1, satır 5, .tff -> .ttf). Başka bir hala bekliyor !!
Shambho

1
Harika iş, gerçekten çok kolay kullanmamıza izin veren theme_xkcd () 'i seviyorum. Bunu geliştirmek istiyorsanız, xkcdaxis () işlevinin argüman olmadan çağrılmasını öneririm (sadece normal ekseni çizer). ör. ggplot (veri = geçici.al, aes (x = State.Code, y = Sample.Value, dolgu = yıl)) + geom_boxplot () + coord_cartesian (ylim = c (0,40)) + theme_xkcd () + xkcdaxis ()
zipp

görünüşe göre bu konuda bir şey kırılmış. yüklemeden xkcdeserler, ancak çalışan library(xkcd)verim > library(xkcd) Loading required package: extrafont Registering fonts with R Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : there is no package called ‘acepack’ Error: package or namespace load failed for ‘xkcd’ve denedikten acepackverim> install.packages("ace") Warning in install.packages : package ‘ace’ is not available (for R version 3.2.1)
Shawn Meehan

216

Diğer cevapların bazıları ile aynı çizgi üzerinde düşünerek, grafiğin "un-ggplotlot" ve ayrıca x ekseni etiket konumlarının (xkcd'de yaygın gibi görünüyor) esnekliğini ve grafik.

Humor Sans yazı tipini yükleme ve çalışma dizinine el ile indirmeyle ilgili birkaç sorunum olduğunu unutmayın.

resim açıklamasını buraya girin

Ve kod ...

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)

Bu fantastik! Şimdi, element_line'ın temalar üzerinde çalışmak için bir jitter argümanı almasının bir yolu olsaydı ...
jebyrnes

1
(Tema - theme_xkcd <in temasını ': "işlevi bulunamadı hata' Kodunuzdaki bir eksik paketi olabilir miydi, i olsun
Jessen borçlu

1
Hm, hata mesajının çözümü nedir? - Daha yeni bir sürümü ggplot2hile yaptı.
Rico

Ben kullanarak bulundu geom_smoothile method = "loess", span = 0.6, se = FALSEve position = position_jitter(h=0.005)hatlar hem pürüzsüz ve titreşimli olarak, bana gürültülü verilere daha iyi sonuçlar veriyordu.
zeehio

Hala eksik olan bir şey var mı? Izgarada Fehler.Call (C_textBounds, as.graphicsAnnot (x $ etiketi), x $ x, x $ y,: Polygonkante nicht gefunden Ruft auf: ggsave ... <Anonymous> -> widthDetails -> widthDetails.text -> grid .Call Zusätzlich: Warnmeldungen: 1: grid.all içinde (C_textBounds, as.graphicsAnnot (x $ label), x $ x, x $ y,: Für Familie "Mizah Sans" konnte kein Zeichensatz gefunden werden ... Ausführung angehalten
Coliban

189

Temel çizgi çizme fonksiyonu:

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);
}

Temel eksen:

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')
}

Ve örnek kod:

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')

üretir:

Örnek grafik


137

İşte yazı tiplerinde xkcd forumlarındaki ve extrafont paketindeki :

Yukarıda belirtildiği gibi xkcd sitesindeki yazı tipleri hakkında bir forum tartışması var : İlk bulabildiğim bir tane yakaladım, başka (daha iyi?) Seçenekler olabilir (@jebyrnes yukarıdaki yorumlarda olası yazı tipleri için başka bir kaynak yayınlar - TTF dosyası olduğu burada ; birisi, alternatif olarak deneyebilirsiniz bu kaynakla ilgili bir 404 hatası bildirdi burada ya burada uygun şekilde bu URL'leri yerine, xkcdFontURLsen Github-yayınlanmıştır bağlantıları almak için biraz daha fazla çalışması gerekebilir); aşağıda

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

(Bu bir kerelik kullanım içindir: düzenli kullanım için bazı standart sistem yazı tipi dizinine koymalısınız.)

   library(extrafont)

Yazı tipleri hakkında en yararlı bilgiler extrafont github sitesinde idi - bu oradan alınır

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

Github sitesinden az çok kelimesi kelimesine alınan örnek:

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")

resim açıklamasını buraya girin


32

Sadece RStudio kullanarak bir xkcd temalı analiz takvimi tasarladım. Burada bar arsa xkcd stili örneği

  • Kullanılan yazı tipi = HumorSans.ttf [yukarıda verilen bağlantı]
  • Kullanılan paket [xkcd]

Bu çizimi oluşturmak için 'Tehlikeler At Work' için bar arsa proxy

Kullanılan kod

#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)

14

Bu çok, çok kaba bir başlangıçtır ve sadece çizgilerin elle çizilmiş görünümünü ve hissini (kısmen) kapsar. Bunu otomatikleştirmek için biraz çalışma gerekir, ancak yanıt işlevine biraz AR (1) gürültü eklemek biraz elle çizilmiş görünmesini sağlayabilir

set.seed(551)
x <- seq(0, 1, length.out = 1000)
y <- sin(x)

imperfect <- arima.sim(n = length(y), model = list(ar = c(.9999)))
imperfect <- scale(imperfect)
z <- y + imperfect*.005
plot(x, z, type = "l", col = "blue", lwd = 2)

13

İşte ggplot2yukarıdan bazı kodları kullanarak satırları benim almak :

ggplot()+geom_line(aes(x=seq(0,1,length.out=1000),y=sin(x)),position=position_jitter(width=0.02),lwd=1.5,col="white")+
  geom_line(aes(x=seq(0,1,length.out=1000),y=sin(x)),position=position_jitter(width=0.004),lwd=1.4,col="red")+
  geom_line(aes(x=seq(0,1,length.out=1000),y=cos(x)),position=position_jitter(width=0.02),lwd=1.5,col="white")+
  geom_line(aes(x=seq(0,1,length.out=1000),y=cos(x)),position=position_jitter(width=0.004),lwd=1.4,col="blue")+
  theme_bw()+theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())

Eksenlerin nasıl değiştirileceğinden emin değilim, ancak aynı yaklaşımı kullanabilirsiniz jitter. Sonra yazı tipini XKCD'den içe aktarma ve katmanlama ile ilgili geom_text.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.