हम xkcd स्टाइल ग्राफ कैसे बना सकते हैं?


697

जाहिरा तौर पर, लोगों ने यह पता लगा लिया है कि गणितज्ञ और लाटेक्स में xkcd शैली के ग्राफ़ कैसे बनाएं । क्या हम इसे R में कर सकते हैं? Ggplot2-ईआरएस? एक geom_xkcd और / या theme_xkcd?

मैं आधार ग्राफिक्स, बराबर (xkcd = TRUE) में अनुमान लगाता हूँ? मैं यह कैसे करुं?

xkcd # 1064

Ggplot2 में पहले स्टैब के रूप में (और उतना ही अधिक सुरुचिपूर्ण ढंग से नीचे दिखाया गया है), एक महान हाथ से तैयार किए गए लुक के लिए एक लाइन में घबराने वाले तर्क को जोड़ते हैं। इसलिए -

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

यह एक अच्छा उदाहरण के लिए बनाता है - लेकिन कुल्हाड़ियों और फोंट पेचीदा दिखाई देते हैं। फ़ॉन्ट हल (नीचे) दिखाई देते हैं, हालांकि। क्या कुल्हाड़ियों से निपटने का एकमात्र तरीका उन्हें खाली करना और हाथ से निकालना है? क्या अधिक सुरुचिपूर्ण समाधान है? विशेष रूप से, ggplot2 में, नए विषय प्रणाली में element_line को एक जटर-लाइक तर्क लेने के लिए संशोधित किया जा सकता है?


8
क्या आप वास्तव में xkcd रेखांकन के आवश्यक तत्व मानते हैं? एनोटेशन? मनमाना घटता, कुल्हाड़ी, और तराजू? हाथ से तैयार देखो और महसूस?
smcg

8
मैं हाथ से खींचे गए लुक और
फीलिंग

61
अनिवार्य माउस को मत भूलना!
जोर्जेन आर

4
इसके अलावा, फोंट xkcdsucks.blogspot.com/2009/03/… का
jebyrnes

11
जितना मैं आर और xkcd से प्यार करता हूँ, जिन्होंने कभी इस मेम को शुरू किया था, उनके सिर को डुबो देना चाहिए था। एक पेंसिल का उपयोग करें , लोग!
n

जवाबों:


424

आप निम्नलिखित पैकेज पर विचार कर सकते हैं:

पैकेज xkcd : XKCD शैली में ggplot2 ग्राफिक्स प्लॉट करना।

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

कुछ उदाहरण (स्कैटरप्लॉट, बार चार्ट):

  • स्कैटर प्लॉट:

स्कैटर प्लॉट

  • बार चार्ट:

बार चार्ट


@smillig, विंडोज़ r-release रीडमी से : "बाइनरी पैकेज स्रोत प्रकाशित होने के लगभग 1-3 दिनों के बाद CRAN पर उपलब्ध होंगे।"
जीएसई

43
प्रकाशनों में पैकेज का उपयोग करते समय मुझे क्या उद्धृत करना है?
जिग्गीस्टार

1
+1 और महान पैकेज के लिए धन्यवाद। मुझे फोंट स्थापित करने में परेशानी हो रही है ! इंट्रो फ़ाइल में एक सुधार, (सेक -2.1, लाइन 5, .tff -> .ttf)। एक और अभी भी लंबित !!
शम्भो

1
बहुत अच्छा काम, मुझे वास्तव में theme_xkcd () पसंद है जो हमें इसे बहुत आसानी से उपयोग करने की अनुमति देता है। यदि आप इसे सुधारना चाहते हैं, तो मेरा सुझाव है कि xkcdaxis () को बिना तर्क के इसे कहा जा सकेगा (यह सामान्य धुरी को खींचेगा)। यानी ggplot (डेटा = temp.all, anes (x = State.Code, y = नमूना .Value, भर = वर्ष)) + geom_boxplot () + ord_cartesian (ylim = c (0,40)) + theme_xkcd () + xkcdaxis ()
zipp

ऐसा प्रतीत होता है कि इसमें कुछ टूट गया है। स्थापित करने xkcdका काम करता है, लेकिन करने की कोशिश कर library(xkcd)पैदावार > 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’और के लिए कोशिश कर रहा acepackपैदावार> install.packages("ace") Warning in install.packages : package ‘ace’ is not available (for R version 3.2.1)
शॉन Mehan

216

अन्य उत्तरों में से कुछ के रूप में एक ही पंक्ति के बारे में सोचकर, मैंने चार्ट को "अन-जीजीप्लेटेड" कर दिया है और एक्स-एक्सिस लेबल स्थानों (जो कि xkcd में सामान्य प्रतीत होता है) के लचीलेपन पर जोड़ा गया है और एक अनियंत्रित लेबल पर नहीं कर पाया।

ध्यान दें कि मेरे पास हास्य सैंस फ़ॉन्ट को लोड करने के साथ कुछ समस्याएं थीं और इसे मैन्युअल रूप से कार्यशील निर्देशिका में डाउनलोड किया।

यहाँ छवि विवरण दर्ज करें

और कोड ...

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)

यह शानदार है! अब अगर केवल एलिमेंट_लाइन करने का एक तरीका था, तो इसे विषयों में काम करने के लिए एक कड़वा तर्क दिया जाए ... जो इस सौदे को सील कर देगा, मुझे लगता है।
15-30 पर jebyrnes

1
क्या आपके कोड में कोई अनुपलब्ध पैकेज हो सकता है, मुझे "त्रुटि: फ़ंक्शन नहीं मिल रहा है" थीम_xkcd में "विषय" - विषय
Owe Jessen

1
हम्म, तो त्रुटि संदेश का समाधान क्या है? - ggplot2चाल का एक नया संस्करण ।
रिको

मैंने पाया कि शोर डेटा पर मेरे geom_smoothसाथ उपयोग करना method = "loess", span = 0.6, se = FALSEऔर position = position_jitter(h=0.005)मुझे बेहतर परिणाम दे रहा है, क्योंकि लाइनें चिकनी और घबराना दोनों हैं।
18 मई को zeehio

अभी भी कुछ कमी है? ग्रिड में Fehler.all (C_textBounds, as.graphicsAnnot (x $ लेबल), x $ x, x $ y,: Polygonkante nicht gefunden Ruft auf, ggsave ... <Anonymous> -> widthDetails -> widthDetails.text -> ग्रिड .Call Zusätzlich: Warnmeldungen: 1: में grid.Call (C_textBounds, as.graphicsAnnot (एक्स $ लेबल), एक्स $ x, एक्स $ y,: Für Familie "हास्य संस" könnte Kein Zeichensatz gefunden werden ... Ausführung angehalten
कॉलिबान

189

बुनियादी लाइन-ड्राइंग समारोह:

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

मूल अक्ष:

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

और नमूना कोड:

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

पैदा करता है:

उदाहरण चार्ट


137

यहाँ xkcd फ़ोरम और extrafontपैकेज के लिंक के आधार पर फोंट पर एक प्रयास किया गया है :

जैसा कि ऊपर उल्लेख किया गया है कि xkcd साइट पर फोंट के बारे में एक मंच चर्चा है : मैंने पहले वाले को पकड़ा, जो अन्य हो सकता है (बेहतर?) विकल्प हो सकता है (@jebyrnes उपरोक्त टिप्पणियों में संभावित फोंट के लिए एक और स्रोत पोस्ट करता है - TTF फ़ाइल है यहाँ ; किसी को उस स्रोत के लिए एक 404 त्रुटि सूचना दी, तो आप वैकल्पिक रूप से कोशिश कर सकते हैं यहाँ या यहाँ , के लिए उचित रूप से उन URL प्रतिस्थापन xkcdFontURLनीचे, तुम Github पोस्ट लिंक पुनः प्राप्त करने के थोड़ा मुश्किल काम करने के लिए हो सकता है)

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

(यह क्विक, वन-ऑफ उपयोग के लिए है: नियमित उपयोग के लिए आपको इसे कुछ मानक सिस्टम फ़ॉन्ट निर्देशिका में रखना चाहिए।)

   library(extrafont)

फोंट के बारे में सबसे उपयोगी जानकारी एक्स्ट्राफोंट जीथब साइट पर थी - यह वहां से लिया गया है

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

जीथब साइट से अधिक या कम शब्दशः लिया गया उदाहरण:

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

यहाँ छवि विवरण दर्ज करें


32

मैंने सिर्फ RStudio का उपयोग करके एक xkcd थीम्ड एनालिटिक्स कैलेंडर डिज़ाइन किया। यहाँ बार प्लॉट xkcd शैली का एक उदाहरण है

  • फ़ॉन्ट का उपयोग किया गया = HumorSans.ttf [ऊपर दिया गया लिंक]
  • पैकेज का इस्तेमाल किया [xkcd]

इस कथानक को उत्पन्न करने के लिए 'काम में खतरे' के लिए बार प्लॉट प्रॉक्सी

यहाँ कोड का उपयोग किया गया है

#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

यह एक बहुत, बहुत उबड़-खाबड़ शुरुआत है और केवल (आंशिक रूप से) हाथ से खींची गई रेखाओं को देखता है और महसूस करता है। इसे स्वचालित करने में थोड़ा काम लगेगा लेकिन प्रतिक्रिया समारोह में कुछ एआर (1) शोर को जोड़ने से यह पूरी तरह से हाथ लग सकता है

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

यहाँ ggplot2ऊपर से कुछ कोड का उपयोग करने के साथ मेरी तर्ज पर है:

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

सुनिश्चित नहीं है कि कुल्हाड़ियों को कैसे बदलना है, लेकिन उसी दृष्टिकोण का उपयोग कर सकते हैं jitter। फिर यह XKCD से फ़ॉन्ट आयात करने और इसके साथ लेयरिंग की बात है geom_text

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.