Site icon R-bloggers

Schotter Plots in R

[This article was first published on rstats on Irregularly Scheduled Programming, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Translating things between languages reveals how each language approaches different design trade-offs, and I believe it’s a useful exercise. Having something to translate is the first step. I found a plot I wanted to generate, and some code that reproduced it, so off we go!

I don’t recall how I originally found this page (I didn’t keep a note on it, it seems) and this has been sitting on my to-be-posted-about pile for way too long, so here’s the post I’ve been meaning to write.

That post details some ALGOL code that generates Georg Nees’ “Schotter” computer-generated art from 1968 which shows a grid of squares which get increasingly displaced in position and rotation

1   'BEGIN''COMMENT'SCHOTTER.,
2   'REAL'R,PIHALB,PI4T.,
3   'INTEGER'I.,
4   'PROCEDURE'QUAD.,
5   'BEGIN'
6   'REAL'P1,Q1,PSI.,'INTEGER'S.,

7   JE1.=5*1/264.,JA1.=-JE1.,
8   JE2.=PI4T*(1+I/264).,JA2.=PI4T*(1-I/264).,
9   P1.=P+5+J1.,Q1.=Q+5+J1.,PS1.=J2.,
10  LEER(P1+R*COS(PSI),Q1+R*SIN(PSI)).,
11  'FOR'S.=1'STEP'1'UNTIL'4'DO'
12  'BEGIN'PSI.=PSI+PIHALB.,
13  LINE(P1+R*COS(PSI),Q1+R*SIN(PSI)).,
14  'END".,I.=I+1
15  'END'QUAD.,
16  R.=5*1.4142.,
17  PIHALB.=3.14159*.5.,P14T.=PIHALB*.5.,
18  I.=0.,
19  SERIE(10.0,10.0,22,12,QUAD)
20  'END' SCHOTTER.,

1   'REAL'P,Q,P1,Q1,XM,YM,HOR,VER,JLI,JRE,JUN,JOB.,
5   'INTEGER'I,M,M,T.,
7   'PROCEDURE'SERIE(QUER,HOCH,XMAL,YMAL,FIGUR).,
8   'VALUE'QUER,HOCH,XMAL,YMAL.,
9   'REAL'QUER,HOCH.,
10  'INTEGER'XMAL,YMAL.,
11  'PROCEDURE'FIGUR.,
12  'BEGIN'
13  'REAL'YANF.,
14  'INTEGER'COUNTX,COUNTY.,
15  P.=-QUER*XMAL*.5.,
16  Q.=YANF.=-HOCH*YMAL*.5.,
17  'FOR'COUNTX.=1'STEP'1'UNTIL'XMAL'DO'
18  'BEGIN'Q.=YANF.,
19  'FOR'COUNTY.=1'STEP'1'UNTIL'YMAL'DO'
20  'BEGIN'FIGUR.,Q.=Q+HOCH
21  'END'.,P.=P+QUER
22  'END'.,
23  LEER(-148.0,-105.0).,CLOSE.,
24  SONK(11).,
25  OPBEN(X,Y)
26  'END'SERIE.,
Schotter

What’s missing from this ALGOL code is the seeds needed to reproduce the plot. The author went down a rabbit hole investigating and calculating different values, but managed to determine them to be “(1922110153) for the x- and y-shift seed, and (1769133315) for the rotation seed”. They also provided a translation into Python

import math
import drawsvg as draw

class Random:
    def __init__(self, seed):
        self.JI = seed

    def next(self, JA, JE):
        self.JI = (self.JI * 5) % 2147483648
        return self.JI / 2147483648 * (JE-JA) + JA

def draw_square(g, x, y, i, r1, r2):
    r = 5 * 1.4142
    pi = 3.14159
    move_limit = 5 * i / 264
    twist_limit = pi/4 * i / 264

    y_center = y + 5 + r1.next(-move_limit, move_limit)
    x_center = x + 5 + r1.next(-move_limit, move_limit)
    angle = r2.next(pi/4 - twist_limit, pi/4 + twist_limit)

    p = draw.Path()
    p.M(x_center + r * math.sin(angle), y_center + r * math.cos(angle))
    for step in range(4):
        angle += pi / 2
        p.L(x_center + r * math.sin(angle), y_center + r * math.cos(angle))
    g.append(p)

def draw_plot(x_size, y_size, x_count, y_count, s1, s2):
    r1 = Random(s1)
    r2 = Random(s2)
    d = draw.Drawing(180, 280, origin='center', style="background-color:#eae6e2")
    g = draw.Group(stroke='#41403a', stroke_width='0.4', fill='none',
                   stroke_linecap="round", stroke_linejoin="round")

    y = -y_size * y_count * 0.5
    x0 = -x_size * x_count * 0.5
    i = 0

    for _ in range(y_count):
        x = x0
        for _ in range(x_count):
            draw_square(g, x, y, i, r1, r2)
            x += x_size
            i += 1
        y += y_size
    d.append(g)
    return d
  
d = draw_plot(10.0, 10.0, 12, 22, 1922110153, 1769133315).set_render_size(w=500) 
print(d.as_svg())
< ?xml version="1.0" encoding="UTF-8"?> < svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" viewBox="-90.0 -140.0 180 280" style="background-color:#eae6e2"> < defs> < g stroke="#41403a" stroke-width="0.4" fill="none" stroke-linecap="round" stroke-linejoin="round"> < path d="M-50.00005126718646,-100.00004463327559 L-50.00003799937353,-109.99994209889388 L-59.99993546496541,-109.99996863451973 L-59.999975268404185,-100.00007116897186 L-50.00007780291792,-100.00001809772016" /> < path d="M-40.00071025565693,-99.98843209578396 L-40.00637454536543,-109.98832795718559 L-50.0062704142736,-109.98267693528788 L-50.00063266018671,-99.98278105889077 L-40.00073677631825,-99.98840554516684" /> < path d="M-29.995077284756096,-100.0634825084743 L-30.051839290370896,-110.06321887488785 L-40.05157573208719,-110.00647013687228 L-39.994840261670944,-100.00673361987086 L-29.995103669401985,-100.06345582268767" /> < path d="M-19.93165959997083,-99.98229914682717 L-20.000467422836092,-109.98195988140051 L-30.000128248694487,-109.91316532603413 L-29.931346960827128,-99.91350440890828 L-19.93168595245141,-99.98227242927649" /> < path d="M-10.084121639092759,-100.06716104811655 L-10.066925666552578,-110.06704372850753 L-20.06680832411923,-110.084252968841 L-20.084030832245965,-100.08437033411629 L-10.084148220380783,-100.06713455819633" /> < path d="M-0.13979567953820027,-100.0395478025014 L-0.03239251926518261,-110.03886847363795 L-10.031713047890957,-110.1462849009585 L-10.139142742258867,-100.1469645148611 L-0.13982249870743235,-100.03952155344602" /> < path d="M9.961814533928456,-100.095005878406 L9.892189703031272,-110.09466095775636 L-0.10746546868816687,-110.02504939435057 L-0.03786717277388352,-100.02539413027966 L9.96178818363088,-100.09497915870232" /> < path d="M19.991755502754366,-99.88946345415374 L20.00203764844921,-109.88935563359922 L10.002145482654822,-109.89965104709998 L9.991836801348196,-99.89975889497428 L19.991728939787574,-99.8894369458618" /> < path d="M29.883204608721726,-99.98825493069629 L29.941896852088306,-109.98798015410236 L19.942171706563602,-110.04668566505327 L19.88345292802844,-100.04696059742754 L29.883177917737594,-99.98822855130825" /> < path d="M40.03212795532069,-100.2540607286853 L39.82673399590962,-110.25184861623787 L29.828945835850206,-110.04646792184093 L30.034313265232655,-100.04867948929225 L40.03210197025298,-100.25403365365985" /> < path d="M49.93974139009356,-99.98288224729943 L49.98850696549987,-109.98266080693315 L39.988728470576866,-110.03143964999458 L39.9399363598604,-100.0316612197999 L49.93971472530916,-99.98285584142849" /> < path d="M59.71370846977368,-100.06453324132968 L59.98182835691243,-110.06083561016467 L49.98552634382635,-110.32896876034616 L49.717379930602604,-100.33266710302657 L59.7136812321381,-100.06450742676104" /> < path d="M-50.02799835268205,-89.89399240349655 L-49.993390940227165,-99.89382998468048 L-59.993228475485346,-99.9284506648688 L-60.02786242340704,-89.92861317555396 L-50.028024980053154,-89.89396595989895" /> < path d="M-39.88981906362492,-89.96476065432375 L-39.70243144001625,-99.96290224171756 L-49.700572778776305,-100.1503031308093 L-49.88798693335079,-90.15216204070059 L-39.88984609191102,-89.9647346206437" /> < path d="M-29.878082110762897,-89.87067035095136 L-29.702068839857706,-99.86901864712111 L-39.70041690248514,-100.04504518378363 L-39.8764567049047,-90.04669735471612 L-29.878109109414694,-89.87064428653983" /> < path d="M-20.062220141751116,-89.98227866122532 L-20.011789240844593,-99.98204896095166 L-30.01155947365066,-100.03249312950234 L-30.06201690984541,-90.03272296363413 L-20.062246810932677,-89.98225225979542" /> < path d="M-9.9080751481311,-90.06420197078735 L-9.639199105259333,-100.06048402946419 L-19.635480807184027,-100.32937333535175 L-19.904383376086887,-90.3330919901968 L-9.908102387719303,-90.06417615827912" /> < path d="M0.05366425530912,-89.87142795637658 L0.47057590225859425,-99.86263078695174 L-9.52062637515152,-100.27955569017777 L-9.93756453465338,-90.28835396595028 L0.05363663637389404,-89.87140255017333" /> < path d="M10.203500405486142,-89.91995445158382 L10.26929096206511,-99.91963549278309 L0.2696100081652135,-99.98543931688778 L0.20379291653493237,-89.98575845030486 L10.203473695783266,-89.91992809114909" /> < path d="M19.588370553722395,-90.02045539819989 L19.93547450108363,-100.01432692893218 L9.941603430895881,-100.36144413611085 L9.594472963900381,-90.36757352648524 L19.588343112946262,-90.02042979967352" /> < path d="M30.14444694864817,-90.00574105106723 L29.591933792565776,-99.99036315385165 L19.607310956718518,-99.43786324531538 L20.15979761770766,-89.45323967642287 L30.144421919627888,-90.00571308986393" /> < path d="M40.1209431203973,-90.06190665068318 L39.717790485837014,-100.05367412577498 L29.726022475853156,-99.65053474824114 L30.129148596359833,-89.65876620338281 L40.12091767607505,-90.06187906686162" /> < path d="M49.40335995567363,-90.1545933056903 L49.90872880846756,-100.14171259233552 L39.92161019235194,-100.6470946959879 L39.41621483784199,-90.65997675041947 L49.40333211284565,-90.15456814505285" /> < path d="M59.93735565840686,-90.06926350037787 L59.84316435289939,-100.06871735151503 L49.843710376798484,-99.97453931323199 L49.93787514785694,-89.97508521218495 L59.937329373832526,-90.06923671601865" /> < path d="M-49.888992673681855,-79.91381423622045 L-50.38029093122906,-89.90163558750552 L-60.36811293435737,-89.41035058174916 L-59.876841180392695,-79.4225279267952 L-49.88901787363067,-79.91378642896731" /> < path d="M-39.77181953909958,-79.51951089433379 L-39.35691011709312,-89.51079707252853 L-49.34819574477937,-89.92571975092214 L-49.7631316795594,-79.93443467376198 L-39.77184715294291,-79.51948548259628" /> < path d="M-30.69330496202617,-79.38579052075666 L-30.082571697024765,-89.36702061539309 L-40.06380098133462,-89.97776712343911 L-40.67456073242418,-79.99653864947338 L-30.693333068820166,-79.38576565534136" /> < path d="M-19.58085040573569,-79.94019788964178 L-19.62077301364069,-89.94001566340312 L-29.62059084036234,-89.90010632320534 L-29.58069476787186,-79.90028844354099 L-19.580876835282403,-79.94017124832409" /> < path d="M-10.152137135557833,-80.15555581610177 L-10.359184532552586,-90.15330959874979 L-20.356938589901237,-89.94627546672392 L-20.149917722844606,-79.94852113469223 L-10.152163116147491,-80.15552873677926" /> < path d="M-0.33701257548168506,-79.90406770528523 L0.31565816808809455,-89.88264326613275 L-9.662916526790422,-90.53532724922508 L-10.31561374940416,-80.55675342033312 L-0.3370407865163374,-79.90404295819913" /> < path d="M10.095626362391236,-80.09667897707732 L9.90391528859146,-90.09473859818569 L-0.09414458686938598,-89.90304078976057 L0.09753995618075084,-79.90498065996485 L10.09560034029374,-80.09665193763965" /> < path d="M19.57430375048677,-79.58806465581777 L20.427118621243082,-89.5515307253777 L10.463653683202342,-90.4043588156092 L9.610812373497161,-80.44089500910518 L19.574275048446914,-79.58804047992783" /> < path d="M30.181268807686408,-79.61179185211665 L30.77988490372078,-89.59375599213558 L20.797921557951426,-90.19238533218851 L20.199278973881,-80.21042278068629 L30.181240731098505,-79.61176695259942" /> < path d="M40.52336115424119,-80.41196119113626 L39.68580185100374,-90.37672128541928 L29.721040645460068,-89.53917520337541 L30.558573506308896,-79.57441288658865 L40.523336934321215,-80.41193252624095" /> < path d="M50.70668344133314,-79.50935556530763 L50.43284805136809,-89.5055029983069 L40.43670025505422,-89.23168087117948 L40.710509119343506,-79.23553271156862 L50.70665764223378,-79.5093283130193" /> < path d="M59.7816585196118,-79.38423650752962 L60.453944980605385,-89.36150969399795 L50.47667268613208,-90.03380939278608 L49.80435974955058,-80.05653799032538 L59.781630259981135,-79.38421181595169" /> < path d="M-49.01156803874121,-69.76426059473769 L-49.834550526348394,-79.73023516565382 L-59.80052618918472,-78.90726590085157 L-58.97757014718883,-68.9412891461126 L-49.01159230056475,-69.76423196530067" /> < path d="M-40.24072750484152,-69.66713098273362 L-40.07185395773892,-79.66560241831537 L-50.0703251692513,-79.83448923133871 L-50.239225248195055,-69.83601824391329 L-40.240754484874195,-69.66710489904939" /> < path d="M-30.12711222270257,-68.94508417540493 L-29.261023839355065,-78.90740520191704 L-39.22334371673678,-79.77350680322049 L-40.08945853599462,-69.81118807498673 L-30.127140956926354,-68.945060037776" /> < path d="M-20.43630857642466,-69.90718216504658 L-20.627313240648487,-79.90525530647237 L-30.625386635489495,-79.71426390764113 L-30.43440850205118,-69.71619025940251 L-20.436334600432545,-69.90715512744757" /> < path d="M-9.510267987465628,-70.20508003237234 L-10.488327292290066,-80.15703206799337 L-20.440280625586425,-79.17898596736896 L-19.46224772916378,-69.2270313364148 L-9.510291800569307,-70.20505102863396" /> < path d="M0.7037446989713549,-69.94471263019955 L0.5620487713033944,-79.94360614834132 L-9.436844934831004,-79.80192348715437 L-9.295175540125328,-69.80302959304494 L0.7037185419415293,-69.9446857212691" /> < path d="M10.662629268798504,-70.31317013608346 L9.937427843212802,-80.2867368108184 L-0.036139793706921,-79.5615486181107 L0.6890351661214957,-69.58798001902377 L10.662604727358094,-70.31314174597163" /> < path d="M20.417297459520913,-70.63610212028384 L19.26268700311582,-80.569118984108 L9.329668607369138,-79.41452170678 L10.484252705618008,-69.48150177912828 L20.417274165157266,-70.636072698296" /> < path d="M30.426997598921773,-71.00114368409805 L29.74289310934961,-80.97761351918513 L19.76642236660497,-80.29352226634283 L20.450500382716196,-70.3170506159582 L30.426972940723278,-71.00111539533715" /> < path d="M41.162330656043956,-69.93381953730288 L40.339674810797284,-79.89982107670355 L30.373672179909807,-79.07717845429758 L31.196301579473616,-69.11117473194085 L41.16230639328207,-69.93379090866105" /> < path d="M49.789388506957,-68.96897474006617 L51.05045113608405,-78.88903877052859 L41.130388778801816,-80.15011456154485 L39.86929982589855,-70.23005387746028 L49.78935883676801,-68.96895176267223" /> < path d="M58.83327640684147,-69.01696378959564 L59.69879692905628,-78.97933416760709 L49.736427699421796,-79.84486790784331 L48.87088074116569,-69.88249982660335 L58.83324767399359,-69.01693965032888" /> < path d="M-49.47723692115735,-60.69848840497862 L-50.760450362570396,-70.61571143296544 L-60.67767509310953,-69.33251114967442 L-59.39448796794281,-59.41528471660043 L-49.477259832351415,-60.6984586836406" /> < path d="M-39.76628895379624,-60.77715729794572 L-40.502600008840965,-70.74990994469647 L-50.475353632516686,-70.01361212144971 L-49.739069041069186,-60.040857520866574 L-39.76631346359619,-60.777128880513516" /> < path d="M-28.917713319430735,-61.02411328466083 L-29.702093089424643,-70.99320038927975 L-39.67118123474587,-70.20883384622043 L-38.88682791862251,-60.23974466021445 L-28.917737691949323,-61.024084749400465" /> < path d="M-18.934213321033265,-60.77316939426913 L-19.90273817400964,-70.72605384714119 L-29.855623911906765,-69.75754219960196 L-28.887125469806392,-59.80465517669729 L-18.93423716191169,-60.7731404133571" /> < path d="M-10.992346017384452,-60.27362525911041 L-9.753008370567382,-70.19642685544585 L-19.67580832254722,-71.43577766778434 L-20.91517230040496,-61.51297936017757 L-10.992375637188724,-60.273602216802765" /> < path d="M-0.49507286999073674,-59.68245424325132 L-0.46990591878788646,-69.6823200397319 L-10.469771681868288,-69.70750025870564 L-10.494965168612861,-59.70763452904303 L-0.49509947238564056,-59.68242777452766" /> < path d="M9.91991242100088,-60.34858837160502 L10.048063722112587,-70.34766465729653 L0.04898760646036404,-70.47582922513152 L-0.07919022809767018,-60.47675327953619 L9.919885547423158,-60.348562178255335" /> < path d="M19.26713110298649,-59.76385642056739 L19.91925393103816,-69.74246780393077 L9.940643412916813,-70.39460387155252 L9.288494105726123,-60.415994218690756 L19.267102893310724,-59.76383167193228" /> < path d="M30.52784120713736,-59.9003283199372 L30.518087354486553,-69.9002210286323 L20.518194632858886,-69.89048044378812 L20.52792194989643,-59.8905877092455 L30.52781469733641,-59.90030175847639" /> < path d="M40.37896477241583,-59.52229714956463 L40.32927057025239,-69.52207113747687 L30.32949651641493,-69.47239020296259 L30.379164183280004,-59.47261608321751 L40.37893836891508,-59.52227048243327" /> < path d="M50.34786961768798,-60.52285657360413 L50.09501114409041,-70.5195566248903 L40.0983107573217,-70.26671141486358 L40.35114270377715,-60.27001069262993 L50.34784376145814,-60.52282937551365" /> < path d="M59.56872213036472,-61.782925932929295 L58.28598441845441,-71.7002105051042 L48.36869814435839,-70.41748595139758 L49.65140953985906,-60.500197975397896 L59.56869921774495,-61.78289621269036" /> < path d="M-49.25521468366633,-50.40791517674687 L-48.65613976626336,-60.38985179077091 L-58.63807558542907,-60.98893995215592 L-59.23717699079505,-51.007004927866106 L-49.25524276139871,-50.407890278520206" /> < path d="M-40.67217612814775,-49.56624961539246 L-41.25423034343075,-59.54919317996931 L-51.237174680265376,-58.967152210005395 L-50.655146955621575,-48.98420710093057 L-40.67220107432412,-49.56622158025323" /> < path d="M-31.15108770889861,-49.80373258865845 L-30.422490856691105,-59.77705179291579 L-40.395809094241095,-60.50566187767168 L-41.12443241154408,-50.532344606846614 L-31.151116107461494,-49.80370805699781" /> < path d="M-20.535708294622626,-49.1787634895236 L-20.57918680728025,-59.17856643468168 L-30.578989810116596,-59.135101189711605 L-30.535537832834155,-49.13529812921459 L-20.53573471469408,-49.178736838809336" /> < path d="M-9.500434218456487,-50.518481761139775 L-9.721314312606335,-60.51593950333921 L-19.718772347859556,-60.29507267376547 L-19.497918782862307,-50.29761434547607 L-9.50046016155432,-50.51845464589643" /> < path d="M0.5920194124193161,-51.07087648272763 L-0.5274312154964891,-61.00791727034212 L-10.464473488383613,-59.8884798268423 L-9.34504922930176,-49.95143606870003 L0.5919960140781555,-51.07084714336196" /> < path d="M9.92028315362204,-50.63389413145994 L8.161076464870709,-60.477833441985354 L-1.682865179752504,-58.71863981412402 L0.07631538721575559,-48.87469583542034 L9.920261699982566,-50.633863341492415" /> < path d="M20.950241234424745,-49.92342854082978 L19.94874320195331,-59.87304918756858 L9.999121226440792,-58.871564356203926 L11.000592856696908,-48.9219410519352 L20.950217489704325,-49.92339948108101" /> < path d="M29.65938383957851,-50.71576468216506 L28.61641230737596,-60.66112338389473 L18.671052221845727,-59.618165047144274 L19.713997363142273,-49.672803577831 L29.659360216221085,-50.71573552367178" /> < path d="M40.29321051895712,-49.64028073066216 L39.10026148111802,-59.56876610941828 L29.17177451957195,-58.37583024464396 L30.364697211279385,-48.44734170032541 L40.29318733835293,-49.64025121896386" /> < path d="M52.024354329945204,-49.740199880729136 L50.13503259260701,-59.55999685907225 L40.315233107530105,-57.67068815059224 L42.20452878714861,-47.850886158798815 L52.02433328564125,-49.7401688095525" /> < path d="M60.63764231396416,-50.07567008983329 L59.44978625764376,-60.00476608657529 L49.52068868486914,-58.81692320412983 L50.708518393437565,-48.887824055340076 L60.637619118224976,-50.07564059002939" /> < path d="M-49.924942659880294,-40.54749947908552 L-51.669271999955754,-50.39408591685202 L-61.51586075208085,-48.649769641178736 L-59.7715575408128,-38.80317857471237 L-49.92496416002251,-40.54746872157211" /> < path d="M-38.804613102323614,-40.98868132596743 L-39.006020167055844,-50.98655032477567 L-49.00388943308116,-50.78515652516518 L-48.80250889859276,-40.7872869919404 L-38.804639098186115,-40.988654261306344" /> < path d="M-29.77798366617838,-40.58797711817659 L-30.79716424851113,-50.535802019312065 L-40.744990501881446,-49.51663463570352 L-39.7258363169989,-39.56880703011588 L-29.778007359211443,-40.58794801627063" /> < path d="M-20.60115757951953,-41.69321304925731 L-21.311921710108564,-51.667818990031265 L-31.286528593911964,-50.957068093699114 L-30.575790931837947,-40.982460266883834 L-20.601182162028337,-41.693184694698466" /> < path d="M-11.359802889021495,-38.58750447414553 L-10.443448978619703,-48.54532777213323 L-20.401271060784936,-49.46169489452335 L-21.317651395161768,-39.5038740281981 L-11.359831744694034,-38.58748048183617" /> < path d="M0.9963765233581228,-38.59393963099782 L1.0634610270413258,-48.59361207525422 L-8.936211328198892,-48.66070984645173 L-9.003322366910592,-38.66103758024529 L0.9963498102444603,-38.59391327401953" /> < path d="M9.322668408674204,-40.52492846316482 L9.662330332801476,-50.51905569371144 L-0.3317964470746322,-50.85873087799541 L-0.6714848915147176,-40.8646045488074 L9.322640986967603,-40.52490284421181" /> < path d="M18.263906483189043,-38.78069087780473 L19.975792610081854,-48.63296955898337 L10.123516200233666,-50.34486875782775 L8.411603929440734,-40.49259461932735 L18.263875796575995,-38.78066927658888" /> < path d="M31.18732832229803,-41.472805126272966 L30.37896795216725,-51.439976381702316 L20.411795624218257,-50.63162923596421 L21.22012954556228,-40.66445583551312 L31.18730401849792,-41.47277653246163" /> < path d="M38.38741442182283,-38.672549523793904 L39.10937262545023,-48.64635149071054 L29.135571616432827,-49.36832292752685 L28.41358694642887,-39.394522876426244 L38.38738603959512,-38.67252497323592" /> < path d="M50.28740695081568,-40.7034127017291 L49.06899206631963,-50.62880511171943 L39.14359803975139,-49.41040339618445 L40.361986586323155,-39.48500775305577 L50.2873838459948,-40.703383130662175" /> < path d="M59.66998839907298,-42.098588402296876 L58.42984112862913,-52.02128884475032 L48.50713904076335,-50.78115473969588 L49.747259980426215,-40.858451006435224 L59.669965359064264,-42.09855878070434" /> < path d="M-50.184608262793475,-32.11721655170345 L-51.47476541589325,-42.033538644261796 L-61.39108922021679,-40.743394648088696 L-60.10095838097264,-30.827069132017414 L-50.184631153171075,-32.117186814330346" /> < path d="M-39.92651105152822,-31.563288375129822 L-41.40946966030007,-41.45261510083388 L-51.29879835357734,-39.969669613171575 L-49.81586598702718,-30.080338952338508 L-39.92653335865572,-31.56325819777391" /> < path d="M-28.15893101929954,-31.18145638517782 L-30.548506274247007,-40.891650998263486 L-40.25870405780038,-38.502088626754784 L-37.86915456973464,-28.791887672750796 L-28.158950445297137,-31.181424277369363" /> < path d="M-18.928091362379945,-30.29989092552472 L-20.769609019607,-40.12876482039061 L-30.59848535778046,-38.2872602040649 L-28.75699378235934,-28.458381422601157 L-18.928112557622626,-30.299859957114453" /> < path d="M-11.262862182829146,-28.282067821481448 L-10.160186552984745,-38.220984049038776 L-20.09910131750893,-39.32367286578553 L-21.2018033211561,-29.38475956431199 L-11.262891482750698,-28.282044373766347" /> < path d="M-0.5102380292098898,-29.928672881056187 L-0.21836970593129124,-39.924310039582984 L-10.214006477199888,-40.21619162502169 L-10.5059013247982,-30.220555241028894 L-0.5102653280987903,-29.928647131271497" /> < path d="M10.282649991974344,-27.741036453570914 L11.753192071592725,-37.632217137145894 L1.8620133391341778,-39.10277234033103 L0.39144501238487095,-29.21159555900633 L10.282619842558312,-27.741014108695442" /> < path d="M18.4094191552526,-30.56082468664115 L20.442139093311937,-40.351943058741 L10.65102341822315,-42.38467598760444 L8.618277498559191,-32.59356300954394 L18.409387779574157,-30.560804099083043" /> < path d="M28.871835081289575,-29.19903405299598 L28.27168900050575,-39.180906322504086 L18.28981593473567,-38.58077348561798 L18.88993552772301,-28.5988996236035 L28.871810185964318,-29.199005972691015" /> < path d="M37.97069812303263,-29.04669710338643 L40.44299400318284,-38.73616057687388 L30.75353380993348,-41.208469312952595 L28.2812122179306,-31.519012399958374 L37.970665850652615,-29.046677952035687" /> < path d="M50.91527402372233,-28.99768517891735 L52.349721547969814,-38.894164837019794 L42.45324379309374,-40.32862549186471 L41.0187700076539,-30.432149640232424 L50.91524395602498,-28.997662724200197" /> < path d="M58.4997708268342,-27.944705303376352 L60.11383087765164,-37.81348230336021 L50.245056019203105,-39.427555448019184 L48.63096978070543,-29.55878273112335 L58.49974035603119,-27.94468339878982" /> < path d="M-52.68936161911645,-18.460658970995695 L-50.235572245766264,-28.154825620805713 L-59.929735639892534,-30.608627856324574 L-62.38355073757576,-20.91446771789912 L-52.689393854868186,-18.460639758055862" /> < path d="M-40.525975184875186,-18.801544212734946 L-39.545799370130624,-28.753288014463614 L-49.497541871358266,-29.733477033130203 L-50.477744093945155,-19.78173583242111 L-40.526004193772124,-18.801520405915646" /> < path d="M-29.880949519788196,-20.513720734566704 L-30.751455089098364,-30.475656760101856 L-40.7133922696071,-29.60516440823833 L-39.84291313519175,-19.643226072773558 L-29.88097364478847,-20.513691989739197" /> < path d="M-20.801704477027297,-20.815153295696227 L-19.319334589476167,-30.70456828544849 L-29.208747612418925,-32.186951294223654 L-30.691143742415512,-22.29754023810781 L-20.801734653143992,-20.815130986892413" /> < path d="M-10.972300268788263,-19.30851333243507 L-9.414236878710927,-29.1862857430323 L-19.29200722206891,-30.74436223888629 L-20.85009682369681,-20.866593962784943 L-10.972330614869488,-19.30849125538588" /> < path d="M-0.5403295822210583,-19.816747462913995 L1.3393564763032781,-29.63839343721201 L-8.482287004028219,-31.51809252704445 L-10.36199912516545,-21.696451540696753 L-0.5403606328188535,-19.81672638825804" /> < path d="M11.860766787495768,-22.843174578857848 L9.300008787906636,-32.50963555434393 L-0.3664555851715843,-29.948890380168148 L2.194276763586349,-20.282422609514803 L11.860747931797796,-22.843142132850378" /> < path d="M19.746186813555525,-20.554550339532742 L18.928914127239295,-30.520994774699005 L8.962468607728574,-29.70373531181111 L9.7797148471867,-19.737288707973477 L19.7461625353337,-20.55452172400039" /> < path d="M28.332052386451974,-18.40445422739958 L30.37479111295707,-28.193487265360552 L20.58576078530003,-30.236238979902932 L18.54299608272397,-20.447211362567057 L28.332020989721443,-18.404433671960906" /> < path d="M39.21042307261726,-19.912313015505408 L37.116157113922156,-29.69045186793055 L27.33801548284424,-27.59619888282202 L29.43225549436251,-17.818054473108532 L39.21040268269435,-19.912281511032862" /> < path d="M49.53932361514691,-19.801328844193307 L51.490602500773605,-29.609002372281534 L41.68293156164087,-31.560294270677687 L39.73162665047869,-21.752625920517726 L49.539292411648624,-19.801307996592943" /> < path d="M60.40413933875045,-22.55807025079512 L57.62054842926875,-32.16273427259755 L48.015880714220565,-29.379156106537504 L50.799446136854044,-19.774484698260466 L60.40412123834303,-22.55803737746249" /> < path d="M-48.837825910737514,-10.633808748158675 L-50.21771739387009,-20.53804263159627 L-60.12195310813194,-19.15816428935188 L-58.74208790677817,-9.253926744283202 L-48.8378485309201,-10.633778804743933" /> < path d="M-39.0196165153297,-11.760523744341082 L-39.519680123690286,-21.74791007464034 L-49.5070671174626,-21.247859717493412 L-49.007030011530205,-11.26047206026563 L-39.01964169086453,-11.760495914982606" /> < path d="M-26.99110629953718,-11.856955195485721 L-29.488743835960193,-21.539917348654857 L-39.17170930297354,-19.042292659538813 L-36.67409746116886,-9.35932387869829 L-26.99112536651822,-11.856922873187216" /> < path d="M-22.29545191337334,-8.498553067395122 L-21.823418580730408,-18.48730343247729 L-31.812168319512367,-18.959350018142818 L-32.28422815819965,-8.970600905678651 L-22.29547967207087,-8.498527813970428" /> < path d="M-12.220058394295894,-10.838115912792105 L-9.860266856881568,-20.55559157383715 L-19.57773938695869,-22.91539600434652 L-21.937556710558937,-13.19792660525442 L-12.220090442468974,-10.838096388567447" /> < path d="M-0.6106531094494274,-11.017571691381933 L-2.0350092020275943,-20.915508801941414 L-11.932948202406756,-19.49116584189695 L-10.508618374898496,-9.593224951715525 L-0.6106755949322382,-11.017541646685075" /> < path d="M8.359321695200709,-12.314891846908907 L7.932981970959886,-22.30569680760098 L-2.057823555388765,-21.879370339109567 L-1.6315103426475144,-11.888564247121927 L8.35929631496153,-12.314864204112268" /> < path d="M22.23169014636191,-11.79783850806203 L20.097138239759982,-21.567262108309755 L10.327711807408281,-19.432723163731083 L12.462237789959943,-9.6632938992926 L22.231669886468005,-11.797806919813494" /> < path d="M29.840338428373386,-6.7005924191130415 L32.752249681129456,-16.267134227892623 L23.185711735867283,-19.179058173484982 L20.273775097443764,-9.612524091757061 L29.84030531562059,-6.700574760507505" /> < path d="M37.752934802168916,-10.769022980056768 L38.72945674655354,-20.721125984708117 L28.777355037555278,-21.697661133491355 L27.800806684375143,-11.74556072016371 L37.75290580201465,-10.76899916258839" /> < path d="M51.88279271918266,-10.954588550307198 L49.80919080596119,-20.7371303686967 L40.026646236335864,-18.663541434903607 L42.10022219069692,-8.880994114059677 L51.882772262742236,-10.954557088985053" /> < path d="M62.92914790262257,-11.680454852829667 L59.545353871268176,-21.09044354976366 L50.13536068474181,-17.70666200353722 L53.519129745834334,-8.296664327435057 L62.929131911495745,-11.680420903387711" /> < path d="M-46.440492854604926,-3.144686172558498 L-49.51487811676356,-12.660257862314026 L-59.030453885589395,-9.585885225370053 L-55.95609387386549,-0.0703053774906719 L-46.44050994694931,-3.1446527639890927" /> < path d="M-37.284987223694074,1.5281656393096115 L-38.63729269457436,-8.379872473075825 L-48.54533260118308,-7.0275801481311255 L-47.19305342217635,2.8804615526834225 L-37.28500992717341,1.5281955196170451" /> < path d="M-28.496369049883135,1.473609948295076 L-28.076003830199735,-8.517448174102954 L-38.06706139485054,-8.937826649870914 L-38.48745312670232,1.0532303570150816 L-28.49639667759872,1.4736353449499413" /> < path d="M-19.786605916572608,0.2835717087285268 L-17.682817254024457,-9.492522735700135 L-27.45890890714845,-11.596324369118655 L-29.562723511433635,-1.820235507316534 L-19.786637440970598,0.2835920678316066" /> < path d="M-10.06206857293809,3.597532292923229 L-6.815647024267648,-5.860728459000633 L-16.273903468847642,-9.107162556840313 L-19.520350115850846,0.3510895803791585 L-10.062102286008539,3.597548776540177" /> < path d="M-2.149234553733667,0.5745471534435858 L-0.3686395955251687,-9.265545880560595 L-10.208730267036383,-11.046153894552747 L-11.989351336809051,-1.2060655855518156 L-2.1492653903357297,0.5745685399982312" /> < path d="M8.10798739875164,-0.46776428623223865 L9.627436816593727,-10.351550139318821 L-0.2563470204864222,-11.871012670916201 L-1.7758226658364178,-1.9872308498598832 L8.107957139178666,-0.467742090759943" /> < path d="M21.72991516729038,-0.5380050331673543 L21.860778368666693,-10.537046194477806 L11.861737380993672,-10.66792266253079 L11.73084764626425,-0.6688818485127968 L21.72988828660961,-0.5379788471071709" /> < path d="M31.272243121565367,-0.3286109305491678 L31.931198620982837,-10.306773435381537 L21.953036990458045,-10.965742173773515 L21.294055013092713,-0.9875814175738657 L31.27221489494966,-0.3285862012363463" /> < path d="M39.63529978638704,-0.28909779063421404 L42.897358391631734,-9.741976874754783 L33.4444836356022,-13.00404802202834 L30.182399946305527,-3.5511775941064747 L39.635266046103084,-0.28908136279243024" /> < path d="M48.72611090510717,-1.494976703583757 L49.995981600485074,-11.413917057274546 L40.077042931660976,-12.683800913050774 L38.80714591548866,-2.764863929110823 L48.726081214527,-1.4949537525446521" /> < path d="M60.45029502103119,1.2121553952830717 L59.075728985858,-8.69281898822764 L49.170752778588806,-7.318266094925123 L50.54529253001823,2.586711936085116 L60.45027238475208,1.212185326531198" /> < path d="M-50.24643576859957,9.477430940389725 L-49.341126751380884,-0.4814025709406895 L-59.29995906154315,-1.3867248014880493 L-60.205294505417605,8.572106307488532 L-50.246464597644234,9.47745496468848" /> < path d="M-37.96031353286069,9.223036644081255 L-41.24456320959244,-0.22215543358145684 L-50.68975964477255,3.0620817113147645 L-47.40553503171765,12.507282503995643 L-37.960329881552624,9.223070422787833" /> < path d="M-27.79193890553258,7.848292610032935 L-28.70253120790566,-2.1100592105202036 L-38.66088423661925,-1.1994801208382952 L-37.75031835963012,8.758874116018223 L-27.79196291464821,7.848321451723468" /> < path d="M-23.330917107557987,10.09981725547049 L-19.959270953150416,0.6854690819364482 L-29.373614653193258,-2.686189563377268 L-32.745285789407184,6.728149663157803 L-23.330951036396453,10.099833290266005" /> < path d="M-8.597231310764265,8.875756296763575 L-7.460971151194861,-1.059376423680097 L-17.396102364045603,-2.1956497651318903 L-18.53238888737779,7.739479940108438 L-8.597260689765363,8.875779645319012" /> < path d="M-0.39152443968304596,8.369949651925884 L-2.784070739808032,-1.3395133365618603 L-12.49353690270545,1.0530200810950752 L-10.101016367520774,10.76248941838508 L-0.3915438558552804,8.36998176567687" /> < path d="M11.805206545863314,5.648093841095626 L7.950439250888133,-3.5789706121660303 L-1.2766303168509783,0.2757844403837306 L2.5781124932665795,9.502859122584052 L11.805192289911865,5.648128554905483" /> < path d="M22.767610762596796,9.384370124358046 L19.44322019056654,-0.04676854749125692 L10.012077107941089,3.277609511349414 L13.33644265358632,12.708757004734402 L22.76759455771425,9.38440397229046" /> < path d="M28.073829696013,11.488727973907942 L27.667327696751933,1.4970962028881623 L17.67569538639617,1.9035849453028257 L18.082170871963715,11.895217794976983 L28.07380426093868,11.48875556625727" /> < path d="M40.81066933659364,8.858505162070474 L38.77730312284473,-0.9324790154185045 L28.98631624750445,1.1008742077007798 L31.01965647999053,10.891863780875118 L40.81064875098169,8.858536539025824" /> < path d="M48.28335318466582,8.476725592077305 L46.43208733706194,-1.3503168971231263 L36.605042391620074,0.5009359120093029 L38.456282162277795,10.327983313675295 L48.28333202015062,8.476756581495543" /> < path d="M61.069099183971005,7.51236887582233 L60.20291977883354,-2.449944237163571 L50.240605516613996,-1.5837780499730663 L51.10675848585602,8.378537361462591 L61.06907504649024,7.512397610170575" /> < path d="M-52.3521775724961,19.447072845852468 L-48.27350149603288,10.316774341074995 L-57.40379458923571,6.238086150581903 L-61.48249489375149,15.36837383219402 L-52.352212623746155,19.447086250725313" /> < path d="M-44.695557939887685,22.138860588019945 L-40.89651175103503,12.888714784951798 L-50.14665251353994,9.089656323056243 L-53.94572324847171,18.33979204498163 L-44.69559256714212,22.13887505294292" /> < path d="M-31.350695884610836,19.85920639964653 L-29.12428575022971,10.110306603434644 L-38.87318259244341,7.883883534264982 L-41.09961859639769,17.632777422463334 L-31.350727662231844,19.859226361198314" /> < path d="M-18.676643658697678,20.53827808645673 L-16.147814243750865,10.863415239203812 L-25.82267373575731,8.334572987700573 L-28.351528823812522,18.009429124443503 L-18.67667604235013,20.538297049046243" /> < path d="M-10.430458821757108,24.20230715733701 L-6.477436300676238,15.016907750077543 L-15.662830463077514,11.063873041859095 L-19.615877358426577,20.24926195938601 L-10.430493685790193,24.20232104185873" /> < path d="M-3.1628965797867146,19.706463577250766 L-0.47020898380954446,10.075919312593351 L-10.10074967581432,7.383218938861569 L-12.793462827295977,17.01375605819675 L-3.1629292806473344,19.70648198742354" /> < path d="M10.28863065458726,15.042868752569326 L6.278122762077047,5.882422487939616 L-2.8823288236660054,9.892918226412947 L1.1281547607633846,19.053375133253216 L10.28861698868474,15.042903702874826" /> < path d="M22.868435173835838,17.614385346216938 L20.102914717649462,8.004502624275434 L10.493028326437992,10.770010330116019 L13.258523281927923,20.379900390580545 L22.868417011628583,17.614418185446134" /> < path d="M29.661604284451613,24.249981405821188 L33.541687467862445,15.033533944197618 L24.325245154321557,11.15343853245474 L20.445137514253467,20.369875697896727 L29.66156953158033,24.249995566283197" /> < path d="M37.00038449961981,19.27521166291432 L38.83764735339691,9.445541549976348 L29.00797967813857,7.608265654244726 L27.17069074045566,17.437930891806133 L37.00035354030283,19.275232871437098" /> < path d="M52.20961095857639,21.68992378530623 L52.345858400734656,11.690954540551026 L42.34688933676066,11.55469383181152 L42.21061536144015,21.553662714986697 L52.209584063798914,21.689949956887975" /> < path d="M58.25947102872713,20.053509069128935 L58.94456251227291,10.077106963047397 L48.96816131517604,9.392002242862816 L48.283043358353865,19.368402530957464 L58.25944273742873,20.053533724416017" /> < path d="M-51.409591594756094,30.329790715240765 L-48.02743209940961,20.91921440605052 L-57.43800392115961,17.537042424802387 L-60.820188388303436,26.94760975909558 L-51.40962554148362,30.329806712129148" /> < path d="M-36.78170325890691,32.19713534008611 L-38.0990505022437,22.284388719520848 L-48.011798870649834,23.601722810674847 L-46.69447793168094,33.51447292690441 L-36.7817260676454,32.19716514012294" /> < path d="M-31.88510993997008,32.300203083994724 L-29.166940696010037,22.676819828390446 L-38.790320345152765,19.95863781617701 L-41.50851512561482,29.582013858841243 L-31.885142689446017,32.30022140754713" /> < path d="M-25.073606321767592,29.951872032015405 L-20.82261389779206,20.900517838616622 L-29.873962450987822,16.649513405354277 L-34.124978893529494,25.700856318331084 L-25.073641620787573,29.9518847701446" /> < path d="M-13.361179681737555,30.945712419351203 L-10.356467941706597,21.407910959770735 L-19.894265414642465,18.403186565036123 L-22.899002464075448,27.940980051310603 L-13.36121296447915,30.945729755436663" /> < path d="M3.240805035060984,25.694970927680977 L-0.4721950945533111,16.40995184528059 L-9.757219103335151,20.122939655575685 L-6.044243612365792,29.407968590722632 L3.2407902491299114,25.69500541908554" /> < path d="M10.790573581442104,32.695689151541394 L10.929670599996347,22.69675914166111 L0.9307407746780845,22.557648856577682 L0.7916172230657113,32.55657849731633 L10.79054667920714,32.6957153154574" /> < path d="M16.59023891673982,28.492874221247956 L17.289415294850155,18.5174493322847 L7.3139913335593265,17.818259718832145 L6.614788484765784,27.79368275243298 L16.59021059065907,28.49289883656628" /> < path d="M25.850091275002733,28.508584598427493 L29.297987059001375,19.12189380849841 L19.911300843731084,15.673985570289366 L16.463380151317708,25.06066721088434 L25.85005721722084,28.508600357495983" /> < path d="M43.80897191806094,30.788835255331612 L41.89414119688982,20.973980562962783 L32.079283963942,22.888798261833106 L33.994088640508146,32.703658035342634 L43.808950954562114,30.788866381084027" /> < path d="M48.50131881283751,32.325551285843616 L48.686087277593174,22.327360952713974 L38.6878971896222,22.14257922241056 L38.50310219377136,32.14076906520528 L48.50129179137223,32.32557732660322" /> < path d="M62.12226109401942,29.698837036835076 L63.0503306715663,19.742098806757568 L53.09359367285553,18.81401601866203 L52.16549767421298,28.77075178598853 L62.122232210137675,29.698860995176474" /> < path d="M-50.83766377619863,42.107080231858276 L-46.33127872717803,33.180129850399965 L-55.258223129579804,28.67373295715112 L-59.764631867048955,37.600671380480634 L-50.83769942280741,42.10709196216216" /> < path d="M-44.07568154160499,38.3971885795293 L-40.73855895726908,28.97054749268557 L-50.1651956164273,25.633412401133306 L-53.50234321519003,35.06004463258942 L-44.07571541145263,38.39720473855675" /> < path d="M-30.517239613775367,40.43933767100262 L-33.584171752158255,30.92136117483447 L-43.10215231750793,33.98828068481202 L-40.03524543594113,43.506265319326474 L-30.517256732278646,40.4393710661758" /> < path d="M-22.954979071331536,39.09140512092678 L-18.45186639591141,30.16280357558242 L-27.380461966540995,25.659679053743293 L-31.883598334791195,34.58826864964239 L-22.955014713638313,39.09141686429573" /> < path d="M-9.41891675312968,40.41875041431992 L-6.440299781068754,30.87276747609896 L-15.986278767267518,27.89413783847921 L-18.964921070440848,37.44011287263897 L-9.418949988336896,40.41876784136063" /> < path d="M-4.161590469393531,40.21594305907277 L0.559751102979213,31.40079229008192 L-8.255393401751975,26.67943902181628 L-12.976758365902205,35.49457726227228 L-4.161626389736895,40.21595392229879" /> < path d="M10.21121265428821,42.071617443008535 L14.12552791284303,32.86965649005399 L4.923572153390099,28.955329022387787 L1.0092324766193963,38.15727958832291 L10.21117784902051,42.07163147419122" /> < path d="M18.55630026033303,39.34432628896722 L17.956805903887236,29.36241485679929 L7.97489367632204,29.96189596929541 L8.574361544867426,39.94380899224029 L18.55627536317444,39.344354367646694" /> < path d="M34.31832089457123,36.233791729241055 L31.347396714784626,26.68541182262787 L21.799012866372802,29.656323333670123 L24.769911708665486,39.204711123863774 L34.31830344062415,36.23382495032589" /> < path d="M44.859234147899336,39.20697447731243 L40.38689991275729,30.262916348463335 L31.442835850045835,34.735238716670764 L35.915146351310774,43.67930871322885 L44.85922228169973,39.207010078914266" /> < path d="M49.256777818218744,41.187630820655166 L47.140085750128215,31.414322066096258 L37.36677418716168,33.531001167008746 L39.4834403208924,43.304315538365714 L49.256757500622584,41.18766237182049" /> < path d="M58.275667842937054,38.25468027236332 L58.20193191225475,28.25505466259265 L48.20230620466042,28.328777325822664 L48.27601560043801,38.32840313122304 L58.27564150362684,38.25470700289801" /> < path d="M-53.18047651529454,47.77504954692451 L-53.55118766941076,37.78202585220283 L-63.54421185598131,38.152723747625885 L-63.17352721925207,48.145748426027716 L-53.180502049036555,47.77507704799295" /> < path d="M-41.41294157747009,45.79349795170366 L-43.26649412805409,35.96688651818911 L-53.09310802084404,37.82042603087358 L-51.239581546062375,47.647042382921654 L-41.41296273477348,45.79352894604604" /> < path d="M-32.26360003953363,53.132808757683456 L-30.813104647572803,43.238668449351685 L-40.707243031385985,41.78815992989727 L-42.15776467833144,51.68229638917444 L-32.26363014360769,53.13283116360838" /> < path d="M-21.24857733812722,47.401060501019 L-24.74347342984925,38.03176753777353 L-34.11277103009678,41.526651198362394 L-30.617899800647226,50.89595343559548 L-21.248592926445077,47.40109463729139" /> < path d="M-9.993196249563299,52.00086449020914 L-6.148088084862568,42.769770702103266 L-15.379176771290428,38.92465028963779 L-19.22430943151388,48.15573387437138 L-9.9932309484908,52.00087878234604" /> < path d="M3.059459034039297,46.420779415606276 L0.9029295988738477,36.656183667787516 L-8.86166901020856,38.81270014733526 L-6.705165486282317,48.57730161766413 L3.059438845275835,46.42081104936319" /> < path d="M13.367154995693951,53.575191935825806 L13.507177521382856,43.57627484369254 L3.5082606150395605,43.43623905149159 L3.3682115563268082,53.43515577202731 L13.367128091037348,53.575218097251614" /> < path d="M21.04052630376069,53.453451864887796 L21.743791544055107,43.47831440594274 L11.768655018207566,42.77503593068747 L11.065363307992675,52.75017152341994 L21.040497967592515,53.45347646859321" /> < path d="M27.65425164867093,51.361847141062604 L31.118896962253306,41.98132571770203 L21.7383801357747,38.51666795809475 L18.27370993014862,47.89718018767486 L27.654217562813727,51.361862839313645" /> < path d="M41.25007228661116,45.66232823752794 L36.71526775632355,36.749781059804945 L27.80271456185289,41.28457376496645 L32.33749544188031,50.19713297616908 L41.250060669799225,45.66236392128373" /> < path d="M52.986716960170874,47.068776868890325 L51.940416549972056,37.12376783044933 L41.99540612331378,38.17005504565999 L43.041680143534435,48.115066860518056 L52.986693346574775,47.068806035289235" /> < path d="M59.32655366185392,44.858828362811266 L54.29822718892211,36.21510912832266 L45.65450128288321,41.243424132807476 L50.68280481891218,49.887156710381454 L59.32654406800602,44.858864642817174" /> < path d="M-46.16011694295546,59.8285600848027 L-49.714611212581055,50.48171463779471 L-59.06146137566567,54.03619650607034 L-55.50699190874627,63.38305138521513 L-46.16013231355775,59.82859431965821" /> < path d="M-41.25173220385054,59.10975324694059 L-36.720864518602895,50.19520405240283 L-45.635407701600684,45.6643245393808 L-50.16629904238913,54.57886171082293 L-41.25176788251835,59.10976487936981" /> < path d="M-27.91135296474256,60.73993741978442 L-27.364285997393022,50.755015434296 L-37.349207257027,50.20793521900341 L-37.89630072026168,60.192855752765354 L-27.91138091238933,60.73996246394116" /> < path d="M-21.08883175171522,58.30698184449452 L-18.372637047669286,48.68304108964945 L-27.99657419867262,45.96683361661043 L-30.712794440699945,55.59076716375508 L-21.088864497430922,58.307000174765925" /> < path d="M-14.546925447215283,63.25447020964938 L-12.401331395821884,53.48746578200216 L-22.16833297669727,51.34185877179902 L-24.313952945706376,61.108857505885375 L-14.546957058426237,63.25449043369667" /> < path d="M-1.877561104397845,57.60554219961185 L-2.730718042755588,47.64210541496835 L-12.694155959354585,48.495249133888265 L-11.841025459874007,58.45868818242523 L-1.8775852794166186,57.60557090238548" /> < path d="M14.190637578722981,60.97790963004257 L10.028559441122358,51.8853272191121 L0.9359715079758644,56.04739329271712 L5.098025517577955,65.13998674806363 L14.190624495108487,60.977944802471804" /> < path d="M15.407933145760872,58.74121743570667 L17.501015788572865,48.96282521748315 L7.722626347449319,46.86972960075211 L5.629517756802912,56.648116264758464 L15.407901643674867,58.74123782931655" /> < path d="M27.641089741222928,57.19917903684005 L26.34124327348286,47.284122381260175 L16.426184893282056,48.58395569375253 L17.726005050524403,58.49901579855681 L27.641066879914717,57.19920879656675" /> < path d="M38.31798181072264,62.181984586224196 L43.46707296518299,53.60965645402386 L34.89475166477807,48.460553925846824 L29.745637762893413,57.032868394441245 L38.31794539966224,62.18199367002446" /> < path d="M50.31109627344028,61.720657196429066 L53.40159012965021,52.21030509738543 L43.89124213106641,49.11979862289159 L40.8007230382941,58.63014252099879 L50.31106283590798,61.720674232044125" /> < path d="M56.81096302511841,64.34066014324657 L60.435552869667035,55.0207729238726 L51.11567045938858,51.39617071374837 L47.491055883695125,60.71604831491491 L56.81092867573334,64.34067525617121" /> < path d="M-50.96487017254155,69.07159352253571 L-56.309825899668596,60.62000209854301 L-64.76142441531384,65.96494661213697 L-59.41649111526236,74.41655221941988 L-50.96487841635666,69.07163013292029" /> < path d="M-40.50719076075693,68.8423465413935 L-44.34527219507368,59.608328985280224 L-53.57929484352569,63.446398167946235 L-49.74123791251718,72.68042590872072 L-40.507205079436474,68.84238122937647" /> < path d="M-29.53034881956114,69.26392235022459 L-24.982161687225258,60.35819704948073 L-33.88788095344981,55.80999810107797 L-38.43609171791144,64.71571133276754 L-29.530384520772543,69.26393391328001" /> < path d="M-23.145228928108583,70.37750713481482 L-24.05364116779316,60.418956209813416 L-34.01219329806253,61.32735523654265 L-33.103807484290236,71.28590857206244 L-23.14525294353755,70.3775359712487" /> < path d="M-11.540252593133513,65.05786246945344 L-15.953149849342987,56.084329880266836 L-24.92668829353125,60.49721523043518 L-20.513814849411798,69.47075952960931 L-11.540264695267606,65.05789799154653" /> < path d="M-3.0983746699899637,70.44605383990259 L-1.20098785963473,60.62781201078955 L-11.019227171295999,58.73041217364283 L-12.91664003523086,68.54864896783504 L-3.0984057585249976,70.4460748585547" /> < path d="M15.187748785060673,65.96990400598649 L12.323995947820915,56.3888357455963 L2.7429238878265068,59.25257587072107 L5.606651300831237,68.83365173030283 L15.187730959983481,65.96993702942318" /> < path d="M24.60430110292888,72.82134939121602 L22.581403064677115,63.02819704634299 L12.788248035841901,65.05108209108842 L14.811120087077441,74.84423980386856 L24.60428048378528,72.82138074614647" /> < path d="M25.16081772721214,73.54640272615903 L27.519122888108434,63.82856623385556 L17.80128952480077,61.47024817938548 L15.44295857676105,71.18807841368023 L25.160785682025786,73.54642225528544" /> < path d="M40.704885634152745,68.08933578957655 L39.99191470875088,58.11488734454529 L30.01746531776221,58.82784503589923 L30.730409775066974,68.80229537282776 L40.70486105791779,68.08936414957341" /> < path d="M52.40189331753321,69.7422419809502 L48.89348916606416,60.37799883838871 L39.529241368578184,63.88639056542466 L43.037620671174864,73.25064301781863 L52.40187777846034,69.7422761396674" /> < path d="M61.64626747246583,63.550899306851015 L56.664538317455765,54.88024051128203 L47.99387291216159,59.86195816210187 L52.97557905878244,68.53263017710597 L61.646257683481195,63.55093553469288" /> < path d="M-46.09750088855164,78.84403670629118 L-46.5895211421967,68.85625089595973 L-56.57730760532932,69.34825789786112 L-56.08531385517247,79.33604501377732 L-46.09752608649026,78.84406451536589" /> < path d="M-37.35641263770574,80.5825086361341 L-39.80383831057335,70.88673342737209 L-49.499616766558695,73.33414623593248 L-47.05221682230984,83.02992793912412 L-37.356431871928976,80.5825408591911" /> < path d="M-32.090303585316896,79.9063113518321 L-31.539492639177283,69.92159520040006 L-41.524208059787384,69.3707710065905 L-42.075045501265926,79.35548569636109 L-32.09033154235243,79.90633638550763" /> < path d="M-25.468340930812875,80.39371858843754 L-22.735518825056985,70.77448615225288 L-32.354747635338754,68.04165128375088 L-35.087595266582035,77.66087646811283 L-25.468373708156847,80.3937368620926" /> < path d="M-8.658216602183892,77.40931345378435 L-7.845616092432351,67.44248699123335 L-17.812441476820357,66.62987325754806 L-18.625068434438006,76.59669756375553 L-8.658245206428605,77.40933774530409" /> < path d="M0.06283236963947081,82.06715364510926 L4.036008783839073,72.89045388404575 L-5.140685705626174,68.91726529425124 L-9.113886471008609,78.09395451210206 L0.06279747521164003,82.06716745306542" /> < path d="M14.877232276411112,80.32777267913141 L9.317249374164948,72.01606169704202 L1.0055310151259294,77.57603357134758 L6.565491861481094,85.88775930732159 L14.877224974375464,80.3278094889266" /> < path d="M19.121616102554082,76.13160301894138 L16.095409049014027,66.60059991369796 L6.564401928622932,69.62679432154908 L9.590583690779768,79.15780545707108 L19.121598841415903,76.13163634061384" /> < path d="M27.679884461205685,76.49146117765704 L25.582352992784738,66.7140222971506 L15.804911329292857,68.81154079291369 L17.902416852394406,78.58898523937381 L27.679864081805533,76.4914926889375" /> < path d="M41.86306583002606,81.86277572254966 L44.6015966904496,72.24516697351214 L34.983991574889316,69.5066233524968 L32.24543519328701,79.12422483456292 L41.86303304184203,81.86279397674738" /> < path d="M50.11421056625046,80.30876480186146 L50.598645663931265,70.32060821722632 L40.61048972205094,69.83615986731077 L40.12602811990148,79.8243151664187 L50.11418277621944,80.30879002080121" /> < path d="M59.14785889671382,82.87724510181306 L61.5576947956895,73.17205884584335 L51.85251173708632,70.7622100700782 L49.44265008453593,80.46738993129779 L59.14782674835483,82.87726446062916" /> < path d="M-45.45230217670333,91.79717449822195 L-46.791567596391275,81.88736534472746 L-56.70137852680757,83.22661761613001 L-55.36213940369276,93.13643032345067 L-45.45232491948519,91.79720434862595" /> < path d="M-34.87999792286725,88.13510319941291 L-41.125853730835566,80.32567079051637 L-48.93529442669484,86.57151623696413 L-42.68945934177864,94.38096521977239 L-34.88000207203514,88.13514049639875" /> < path d="M-28.755643389847787,84.05398977026489 L-34.81371917960347,76.09800667270673 L-42.769710314978674,82.1560719064993 L-36.711655637159865,90.11207107967755 L-28.7556484261926,84.05402695784316" /> < path d="M-19.82790001274616,83.03013812134895 L-24.789734892844244,74.34807938244968 L-33.47180021507307,79.30990274323217 L-28.509988373614906,87.99197464877527 L-19.827909884772822,83.03017432665017" /> < path d="M-8.308970452808417,91.20867745034722 L-6.779697874247343,81.32640672426831 L-16.661966571286506,79.79712103396221 L-18.19126537333493,89.67938770194422 L-8.309000734427457,91.20869961573229" /> < path d="M3.322812229068682,89.99742542136163 L-2.4498631323372138,81.83200023372612 L-10.615295979121747,87.60466476128246 L-4.8426422854251125,95.77010526720164 L3.3228058796143447,89.99746240737488" /> < path d="M9.807053510997232,86.19849303629475 L6.798925297964959,76.6617685474037 L-2.7378031820868665,79.66988410715594 L0.270299724380056,89.20661657835174 L9.80703618670305,86.19852632517544" /> < path d="M19.446833380275976,90.81902554752563 L18.090749059561027,80.91150392816157 L8.183225640959938,82.26757510362619 L9.53928367117186,92.17510032144688 L19.446810688194702,90.81905543649005" /> < path d="M29.10171025776338,88.71177738475956 L22.79020231326766,80.95530803397743 L15.03372458841583,87.26680568722364 L21.345211950401424,95.02329178613152 L29.1017064233517,88.71181471541765" /> < path d="M40.162248762300976,89.46901762429502 L34.43849391006048,81.26922618094059 L26.238694872464542,86.9929701537346 L31.962427965802004,95.19277678555761 L40.162242191837656,89.46905457168678" /> < path d="M50.89728500547778,88.72171322996812 L48.63987168940843,78.97994570844062 L38.898101172765045,81.23734609918056 L41.155488638171576,90.97911961092268 L50.8972651449953,88.72174507085352" /> < path d="M55.862813180095614,90.66891438205482 L58.614083778345915,81.05494228836439 L49.00011533503572,78.3036589343474 L46.248819225256895,87.9176237272604 L55.86278036775581,90.66893259279624" /> < path d="M-50.70528484397037,96.04965775715351 L-50.99070070304685,86.05383427379594 L-60.98652456508393,86.33923687046459 L-60.701135230823624,96.33506111116358 L-50.705310611480314,96.04968503931211" /> < path d="M-42.31544725500711,94.98731383973777 L-43.74381841266602,85.08995534572416 L-53.64117880182648,86.51831337161707 L-52.21283390770208,96.41567565590697 L-42.31546972830019,94.98734389355357" /> < path d="M-29.377877103036354,98.84470524051173 L-35.968821705783206,91.32423992468337 L-43.489295766436605,97.91517454930941 L-36.898371119942965,105.43565735477462 L-29.377879569679195,98.844742686425" /> < path d="M-17.11311382617765,97.45992828142782 L-23.716645288841505,89.95051275525911 L-31.22606957653545,96.55403425446295 L-24.622558040803238,104.06346730366892 L-17.113116230098484,97.45996573141996" /> < path d="M-5.584398084020825,99.64712533502647 L-12.161213523437333,92.11430063250566 L-19.69404695203668,98.691106077403 L-13.117251501670074,106.22394823206763 L-5.5844006209534465,99.64716277624333" /> < path d="M5.616940374216903,98.25990786998281 L-0.732554690268041,90.53450420744605 L-8.457966777275654,96.88398902189924 L-2.1084922128653734,104.6094095333641 L5.616936723043137,98.25994521900792" /> < path d="M8.505767561787277,96.14499692966167 L3.4814720963295036,87.49893398755701 L-5.164597511977135,92.52321798145817 L-0.14032498964142115,101.16929425595157 L8.505757951023497,96.14503320519015" /> < path d="M18.951530389701052,103.24007864916992 L21.873475402442487,93.67659671707162 L12.309997347174338,90.75463901555374 L9.388026956885147,100.3181131939749 L18.951497258442494,103.24009627303025" /> < path d="M26.979281921655755,103.23117333340332 L27.10948613184541,93.23212356921552 L17.110436540420697,93.10190609233777 L16.980205796855103,103.1009555109818 L26.979255042700846,103.23119952123503" /> < path d="M40.94066616850447,104.3441649888936 L41.593812146553795,94.36562052317049 L31.615268547430226,93.71246130563988 L30.962096090419458,103.69100403814635 L40.94063795629126,104.3441897346361" /> < path d="M51.79015463576991,98.2902602793217 L55.01272399457626,88.82384617202968 L45.54631416298114,85.60126425323624 L42.32371968420628,95.06766980911777 L51.79012096435758,98.29027684786838" /> < path d="M56.17230069515767,100.1057885162437 L57.70316570486002,90.22376434884136 L47.821143568610246,88.69288622772112 L46.29025233607482,98.57490633280092 L56.17227040996725,100.10581067674883" /> < path d="M-46.95832606781953,109.42115994986116 L-53.61111781198892,101.9553504604778 L-61.076936128255845,108.60813229904342 L-54.42416419530573,116.07395944218077 L-46.95832822531111,109.42119741485786" /> < path d="M-42.09376074869195,101.35050613169413 L-48.090818252875096,93.34842823813575 L-56.09290410329172,99.34547512519751 L-50.09586783336191,107.3475689324583 L-42.09376606927105,101.35054327967099" /> < path d="M-25.9881857840509,107.5673759259595 L-28.03196595203444,97.77856026991549 L-37.82078431974693,99.82232745014657 L-35.77703012727189,109.6111485295103 L-25.98820633627414,107.56740732479493" /> < path d="M-22.48147829932353,107.97263271975996 L-17.827972819038294,99.12148386393281 L-26.679115500610337,94.46796663999253 L-31.33264446819745,103.31910314729389 L-22.481514135182373,107.97264385851965" /> < path d="M-7.192818204270218,108.29373788021996 L-12.976422559149865,100.1360500957266 L-21.134118017292792,105.91964362702264 L-15.350535309590551,114.07734675880077 L-7.19282450419158,108.29377487470249" /> < path d="M1.7085899981778931,114.00857025122454 L1.3348403745573467,104.01565973717015 L-8.658070635377332,104.3893961022477 L-8.284347528843446,114.38230760804508 L1.7085644727990568,114.00859776005551" /> < path d="M10.033732568892207,106.86262772843693 L8.168216421448557,97.0382804815873 L-1.6561333005497412,98.9037835941355 L0.20935677709975709,108.72813579126517 L10.033711449343487,106.86265874851767" /> < path d="M15.57191030090365,107.8769481671428 L21.211164953018113,99.61881543076343 L12.953039698780312,93.97954982180556 L7.313763132988962,102.23766759388727 L15.571873422900028,107.87695511650216" /> < path d="M31.601717590577508,105.84610816598538 L30.735448204081937,95.88380287689311 L20.773141765636638,96.7500590454521 L21.63938471625753,106.7123666332329 L31.601693453356283,105.84613690055164" /> < path d="M41.78287949539453,103.49849533530632 L37.565590031938314,94.43138891128788 L28.498478012449723,98.64866634454985 L32.715743415510026,107.71578395949264 L41.782866625891046,103.49853058664142" /> < path d="M55.51198344089117,106.82679477965826 L49.65109450859663,98.72445374472505 L41.54874569747303,104.5853319268697 L47.40961312945747,112.68768851416942 L55.51197749291906,106.82683183235551" /> < path d="M59.00345474975128,107.72734799580972 L58.8692612423792,97.72835097482636 L48.87026404335737,97.86253121558009 L49.004431017492536,107.86152859262278 L59.00342857253848,107.72737488510641" />

I wanted to see if I could also translate that to R – base plot can draw line segments just fine, and I was curious about colouring the squares my own way.

Most of that code translates straightforwardly, with the exception that the ‘randomness’ is actually a sequence of values, starting with a specific seed. I tooted recently about an older post of mine which (ab)uses the set.seed() function to generate specific ‘random’ words

printStr <- function(str) paste(str, collapse="")

set.seed(2505587); x <- sample(LETTERS, 5, replace=TRUE)
set.seed(11135560);y <- sample(LETTERS, 5, replace=TRUE)

paste(printStr(x), printStr(y))
## [1] "HELLO WORLD"

which I was inspired to revisit based on a post by Andrew Heiss.

The Random class in that Python translation produces an iterator which returns a ‘next’ value each time it’s called with a specific ‘seed’ and two values

class Random:
    def __init__(self, seed):
        self.JI = seed

    def next(self, JA, JE):
        self.JI = (self.JI * 5) % 2147483648
        return self.JI / 2147483648 * (JE-JA) + JA
      
r = Random(1)
r.next(2, 3)
## 2.0000000023283064
r.next(2, 3)
## 2.000000011641532
r.next(2, 3)
## 2.000000058207661

with the added complexity that the subsequent calls update the seed itself.

When I first saw this, my mind went back to reading the “original” R paper ‘R: A Language for Data Analysis and Graphics’ by Ross Ihaka and Robert Gentleman, in which I recalled seeing the cool example of an OO system maintaining a (non-global) state via <<-

Maintaining the state of the total balance internal to the function

With this same trick we can write an equivalent of the Random class which also updates the seed internally

random <- function(seed) {
  list(
    nextval = function(a, b) { 
      seed <<- (seed * 5) %% 2147483648
      seed / 2147483648 * (b-a) + a
    }
  )
}

r <- random(1)
print(r$nextval(2, 3), digits = 16)
## [1] 2.000000002328306
print(r$nextval(2, 3), digits = 16)
## [1] 2.000000011641532
print(r$nextval(2, 3), digits = 16)
## [1] 2.000000058207661

Cool!

The rest of the translation is mostly aligning to base plot syntax.

This is what I ended up with

draw_square <- function(x, y, i, r1, r2, col) {
  r = 5 * 1.4142
  move_limit = 5 * i / 264
  twist_limit = pi/4 * i / 264
  
  y_center = y + 5 + r1$nextval(-move_limit, move_limit)
  x_center = x + 5 + r1$nextval(-move_limit, move_limit)
  angle = r2$nextval(pi/4 - twist_limit, pi/4 + twist_limit)
  
  x0 <- x_center + r * sin(angle)
  y0 <- y_center + r * cos(angle)
  
  for (step in 1:4) {
    angle <- angle + pi / 2
    x1 <- x_center + r * sin(angle)
    y1 <- y_center + r * cos(angle)
    segments(x0, y0, x1, y1, lwd = 1.75, col = col)
    x0 <- x1
    y0 <- y1
  }
}

draw_plot <- function(x_size, y_size, x_count, y_count, s1, s2) {
  r1 = random(s1)
  r2 = random(s2)
  
  plot(NULL, NULL, xlim = c(-60, 60), ylim = c(120, -120), axes = FALSE, ann = FALSE)
  
  y = -y_size * y_count * 0.5
  x0 = -x_size * x_count * 0.5
  i = 0
  
  for (z in 1:y_count) {
    x = x0
    for (zz in 1:x_count) {
      draw_square(x, y, i, r1, r2, "black")
      x <- x + x_size
      i <- i + 1
    }
    y <- y + y_size
  }
}

draw_plot(10.0, 10.0, 12, 22, 1922110153, 1769133315)

Figure 1: ‘Schotter’ in R

Which uses the special seeds discovered in that original post. Checking the rotations, this does indeed appear to match the original art.

Why stop there, though? Now that I can plot it, I can change things… what if I used a different set of seeds, e.g. swapped them?

draw_plot(10.0, 10.0, 12, 22, 1769133315, 1922110153)

Figure 2: ‘Schotter’ in R with swapped seeds

or completely different values?

draw_plot(10.0, 10.0, 12, 22, 12345, 67890)

Figure 3: ‘Schotter’ in R with new seeds

What about changing the colours? I could plot the colour as a function of the progression down the grid, which I think looks pretty cool.

draw_plot <- function(x_size, y_size, x_count, y_count, s1, s2) {
  r1 = random(s1)
  r2 = random(s2)
  
  plot(NULL, NULL, xlim = c(-60, 60), ylim = c(120, -120), axes = FALSE, ann = FALSE)
  
  y = -y_size * y_count * 0.5
  x0 = -x_size * x_count * 0.5
  i = 0
  
  for (z in 1:y_count) {
    x = x0
    rcol <- scales::viridis_pal(option = "viridis")(y_count)[z]
    for (zz in 1:x_count) {
      draw_square(x, y, i, r1, r2, rcol)
      x <- x + x_size
      i <- i + 1
    }
    y <- y + y_size
  }
}

draw_plot(10.0, 10.0, 12, 22, 1922110153, 1769133315)

Figure 4: ‘Schotter’ in R with viridis colours

Ever since I first drafted this post, I’ve seen other examples of similar work. This toot demonstrated a simplified version

suppressPackageStartupMessages(library(tidyverse))
crossing(x=0:10, y=x) |>  
  mutate(dx = rnorm(n(), 0, (y/20)^1.5),  
         dy = rnorm(n(), 0, (y/20)^1.5)) |>  
  ggplot() +  
  geom_tile(aes(x=x+dx, y=y+dy, fill=y), colour='black',  
            lwd=2, width=1, height=1, alpha=0.8, show.legend=FALSE) +  
  scale_fill_gradient(high='#9f025e', low='#f9c929') +  
  scale_y_reverse() + theme_void()

Figure 5: https://mastodon.social/@safest_integer/114296256313964335

while this one showed a book ‘Crisis Engineering’ with a similar idea

Cover of ‘Crisis Engineering’

I’m sure I’ve seen others around, too.

This was a fun exploration of some artistically inspired code translation, and I got to stretch my ‘maintaining internal state’ muscles a little. I have no doubt that someone more artistic than I could do a lot more with it.

As always, I can be found on Mastodon and the comment section below.


< details> < summary> devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value
##  version  R version 4.5.3 (2026-03-11)
##  os       macOS Tahoe 26.3.1
##  system   aarch64, darwin20
##  ui       X11
##  language (EN)
##  collate  en_US.UTF-8
##  ctype    en_US.UTF-8
##  tz       Australia/Adelaide
##  date     2026-04-17
##  pandoc   3.6.3 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
##  quarto   1.7.31 @ /usr/local/bin/quarto
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package      * version date (UTC) lib source
##  blogdown       1.23    2026-01-18 [1] CRAN (R 4.5.2)
##  bookdown       0.46    2025-12-05 [1] CRAN (R 4.5.2)
##  bslib          0.10.0  2026-01-26 [1] CRAN (R 4.5.2)
##  cachem         1.1.0   2024-05-16 [1] CRAN (R 4.5.0)
##  cli            3.6.5   2025-04-23 [1] CRAN (R 4.5.0)
##  devtools       2.4.6   2025-10-03 [1] CRAN (R 4.5.0)
##  digest         0.6.39  2025-11-19 [1] CRAN (R 4.5.2)
##  dplyr        * 1.2.0   2026-02-03 [1] CRAN (R 4.5.2)
##  ellipsis       0.3.2   2021-04-29 [1] CRAN (R 4.5.0)
##  evaluate       1.0.5   2025-08-27 [1] CRAN (R 4.5.0)
##  farver         2.1.2   2024-05-13 [1] CRAN (R 4.5.0)
##  fastmap        1.2.0   2024-05-15 [1] CRAN (R 4.5.0)
##  forcats      * 1.0.1   2025-09-25 [1] CRAN (R 4.5.0)
##  fs             1.6.7   2026-03-06 [1] CRAN (R 4.5.2)
##  generics       0.1.4   2025-05-09 [1] CRAN (R 4.5.0)
##  ggplot2      * 4.0.2   2026-02-03 [1] CRAN (R 4.5.2)
##  glue           1.8.0   2024-09-30 [1] CRAN (R 4.5.0)
##  gtable         0.3.6   2024-10-25 [1] CRAN (R 4.5.0)
##  hms            1.1.4   2025-10-17 [1] CRAN (R 4.5.0)
##  htmltools      0.5.9   2025-12-04 [1] CRAN (R 4.5.2)
##  jquerylib      0.1.4   2021-04-26 [1] CRAN (R 4.5.0)
##  jsonlite       2.0.0   2025-03-27 [1] CRAN (R 4.5.0)
##  knitr          1.51    2025-12-20 [1] CRAN (R 4.5.2)
##  labeling       0.4.3   2023-08-29 [1] CRAN (R 4.5.0)
##  lattice        0.22-9  2026-02-09 [1] CRAN (R 4.5.3)
##  lifecycle      1.0.5   2026-01-08 [1] CRAN (R 4.5.2)
##  lubridate    * 1.9.5   2026-02-04 [1] CRAN (R 4.5.2)
##  magrittr       2.0.4   2025-09-12 [1] CRAN (R 4.5.0)
##  Matrix         1.7-4   2025-08-28 [1] CRAN (R 4.5.3)
##  memoise        2.0.1   2021-11-26 [1] CRAN (R 4.5.0)
##  otel           0.2.0   2025-08-29 [1] CRAN (R 4.5.0)
##  pillar         1.11.1  2025-09-17 [1] CRAN (R 4.5.0)
##  pkgbuild       1.4.8   2025-05-26 [1] CRAN (R 4.5.0)
##  pkgconfig      2.0.3   2019-09-22 [1] CRAN (R 4.5.0)
##  pkgload        1.5.0   2026-02-03 [1] CRAN (R 4.5.2)
##  png            0.1-9   2026-03-15 [1] CRAN (R 4.5.2)
##  purrr        * 1.2.1   2026-01-09 [1] CRAN (R 4.5.2)
##  R6             2.6.1   2025-02-15 [1] CRAN (R 4.5.0)
##  RColorBrewer   1.1-3   2022-04-03 [1] CRAN (R 4.5.0)
##  Rcpp           1.1.1   2026-01-10 [1] CRAN (R 4.5.2)
##  readr        * 2.2.0   2026-02-19 [1] CRAN (R 4.5.2)
##  remotes        2.5.0   2024-03-17 [1] CRAN (R 4.5.0)
##  reticulate     1.45.0  2026-02-13 [1] CRAN (R 4.5.2)
##  rlang          1.1.7   2026-01-09 [1] CRAN (R 4.5.2)
##  rmarkdown      2.30    2025-09-28 [1] CRAN (R 4.5.0)
##  rstudioapi     0.18.0  2026-01-16 [1] CRAN (R 4.5.2)
##  S7             0.2.1   2025-11-14 [1] CRAN (R 4.5.2)
##  sass           0.4.10  2025-04-11 [1] CRAN (R 4.5.0)
##  scales         1.4.0   2025-04-24 [1] CRAN (R 4.5.0)
##  sessioninfo    1.2.3   2025-02-05 [1] CRAN (R 4.5.0)
##  stringi        1.8.7   2025-03-27 [1] CRAN (R 4.5.0)
##  stringr      * 1.6.0   2025-11-04 [1] CRAN (R 4.5.0)
##  tibble       * 3.3.1   2026-01-11 [1] CRAN (R 4.5.2)
##  tidyr        * 1.3.2   2025-12-19 [1] CRAN (R 4.5.2)
##  tidyselect     1.2.1   2024-03-11 [1] CRAN (R 4.5.0)
##  tidyverse    * 2.0.0   2023-02-22 [1] CRAN (R 4.5.0)
##  timechange     0.4.0   2026-01-29 [1] CRAN (R 4.5.2)
##  tzdb           0.5.0   2025-03-15 [1] CRAN (R 4.5.0)
##  usethis        3.2.1   2025-09-06 [1] CRAN (R 4.5.0)
##  vctrs          0.7.1   2026-01-23 [1] CRAN (R 4.5.2)
##  viridisLite    0.4.3   2026-02-04 [1] CRAN (R 4.5.2)
##  withr          3.0.2   2024-10-28 [1] CRAN (R 4.5.0)
##  xfun           0.56    2026-01-18 [1] CRAN (R 4.5.2)
##  yaml           2.3.12  2025-12-10 [1] CRAN (R 4.5.2)
## 
##  [1] /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/library
##  * ── Packages attached to the search path.
## 
## ─ Python configuration ───────────────────────────────────────────────────────
##  python:         /Users/jono/.cache/uv/archive-v0/3n3euDImmjsw3EYTJjfeY/bin/python
##  libpython:      /Users/jono/.local/share/uv/python/cpython-3.12.12-macos-aarch64-none/lib/libpython3.12.dylib
##  pythonhome:     /Users/jono/.cache/uv/archive-v0/3n3euDImmjsw3EYTJjfeY:/Users/jono/.cache/uv/archive-v0/3n3euDImmjsw3EYTJjfeY
##  virtualenv:     /Users/jono/.cache/uv/archive-v0/3n3euDImmjsw3EYTJjfeY/bin/activate_this.py
##  version:        3.12.12 (main, Oct 28 2025, 11:52:25) [Clang 20.1.4 ]
##  numpy:          /Users/jono/.cache/uv/archive-v0/3n3euDImmjsw3EYTJjfeY/lib/python3.12/site-packages/numpy
##  numpy_version:  2.4.4
##  
##  NOTE: Python version was forced by VIRTUAL_ENV
## 
## ──────────────────────────────────────────────────────────────────────────────


To leave a comment for the author, please follow the link and comment on their blog: rstats on Irregularly Scheduled Programming.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Exit mobile version