Points of Departure

A spider reunion in Tapachula

Note: This is a computational essay, with code in Wolfram Language.

Cyrtophora

Sitting in a hostel room in Pondicherry in 1997, I was wondering what project to pursue for my master's thesis and since I had studied plants before, I was leaning towards some plant ecology project. A senior and good friend of mine suggested I look into spiders, arguing that there were a remarkable neglect of studies of spiders in India. I already liked spiders, especially their webs, and it wasn't hard to convince me to adopt this theme. I settled on the species Cyrtophora cicatrosa, for purely pragmatic reasons.

Here's what they look like:

In[]:= InatFunc[speciesName_String] := Module[{cc, inat, database, images}, cc = Interpreter["TaxonomicSpecies"][speciesName]; 
    inat = ResourceFunction["INaturalistSearch"]; 
    database = Join @@ Quiet@Table[inat[cc, "ObservationGeoRange" -> GeoBounds["World"], "QualityGrade" -> "Research", "MaxItems" -> 100, "Page" -> i], {i, 10}]; 
    images = Import /@ RandomSample[database[;; , "ImageURL"], 25]; 
    RandomChoice[images]]
 InatFunc["Cyrtophora cicatrosa"]

0lrmr1ak8i0br Small

They were abundant in the campus -- I didn't have to wander through some forests looking at scat like other mammal oriented students had to do ; they were predators and so I could ask typical predator related questions; they could be kept in the lab, and they were more or less sedentary so I could even apply techniques from plant ecology in studying them. From such seemingly pragmatic choices, a whole life course is altered. It was a small study, looking at how this spider, with its elaborate 3D web, chooses its host plant, and I even managed to publish it.

I got a job after my masters, studying birds and butterflies for a research NGO but two years of this wore me down and I wanted to get back to spiders. I wrote to many researchers around the world and only a couple responded. I applied to continue my studies with Dr. Yael Lubin, at the Ben Gurion University in Israel, and I resumed my work with the genus Cyrtophora, this time with a colonial species that is found in the hyper arid desert region on the border between Israel and Jordan. Cyrtophora citricola is a colonial spider, unlike the solitary cicatrosa, because they form colonies by linking their webs together.

Here what it looks like:

In[]:= InatFunc["Cyrtophora citricola"]

1lx3r6os544c8 Small

Colonial spiders share structural support for their webs, and can occupy spaces that a single spider could not, but still maintain their own webs and defend their territory. Citricola is thought to be an Afro-Asiatic species, with distributions ranging from the Mediterranean to all the way across to South India. But this species is very hardy and has a predilection for urban structures/environments. The largest colony I ever saw was on a single tree right next to a garbage dump in the Arava valley. In cities, you often find them festooning electric cables and telephone lines.

Citricola is also an invasive species; no doubt helped by its ability to thrive in urban and manmade environments. Spiders have been recorded in South America, ranging from Cuba, to Brazil to Colombia. I only realized this when I was in Colombia for a conference and stumbled upon a rather dense colony in an urban park. Later I found out that they had been spotted in many countries in tropical South America and the Caribbean.

With the help of a former undergrad student, I made a list of records of Cyrtophora citricola, and noted down the lat long positions . Here's a map of their distribution. This map only gives a general idea of the extent of their distribution, but obviously doesn't include all the potential areas they can be found.

In[]:= locs = Import["/Users/dinesh/Library/CloudStorage/Dropbox/projects/cyrtophora citricola/Citricola_mexico/CC_dist_papers2.csv", HeaderLines -> 1];
 GeoListPlot[GeoPosition[locs], GeoBackground -> "VectorVintage", PlotMarkers -> {Graphics[{StandardPurple, Disk[]}], 4}, GeoRange -> "World"]

1vyi8tuvh4sxg

In 2023, Laura Segura Hernandez and collaborators published a couple of papers on the invasion of citricola in the Americas. Their paper aimed to discover the origin of the population that had invaded the Americas. They concluded that the citricola in the Americas most likely came from the South African populations. This paper also had a dataset of citricola distributions, mostly sourced from papers and personal observations. Here's what that map looks like.

In[]:= locsLH = Import["/Users/dinesh/Library/CloudStorage/Dropbox/projects/cyrtophora citricola/Citricola_mexico/Laura_data.csv", HeaderLines -> 1][[All, {1, 2}]];
 GeoListPlot[GeoPosition[locsLH], GeoBackground -> "VectorVintage",PlotMarkers -> {Graphics[{StandardPurple, Disk[]}], 4}, GeoRange -> "World"]

0az6804pvp1gp

This paper also included data from GBIF (the Global Biodiversity Information Facility) to construct their distribution models, but these location data were not provided with the paper. Instead of using GBIF, I'll get the recent (~100 records) distribution data from iNaturalist.

In[]:= InatFuncPlotLocs[speciesName_String] := Module[{cc, inat, database, locs}, cc = Interpreter["TaxonomicSpecies"][speciesName]; 
    inat = ResourceFunction["INaturalistSearch"]; 
    database = Join @@ Quiet@Table[inat[cc, "ObservationGeoRange" -> GeoBounds["World"], "QualityGrade" -> "Research", "MaxItems" -> 10, "Page" -> i], {i, 10}]; 
    GeoListPlot[DeleteMissing[database[All, "GeoPosition"]], GeoBackground -> "VectorVintage", PlotMarkers -> {Graphics[{StandardPurple, Disk[]}], 4}, GeoRange -> "World"]]
In[]:= InatFuncPlotLocs["Cyrtophora citricola"]

141xhe77crqvu

I think there are some issues with iNaturalist import (it crashes if I try to get more points), and it has been suggested that I get the data directly from GBIF for plotting all the points recorded so far. Let's give that a go.

In[]:= GBIFFuncLocs[speciesName_String] := Module[{gbif, totalCount, batchSize, nBatches, database}, gbif = ResourceFunction["GBIFSearch"]; 
    totalCount = Min[gbif[speciesName, "Count", "OccurrenceGeoRange" -> GeoBounds["World"]], 10000]; 
    batchSize = 300; 
    nBatches = Ceiling[totalCount/batchSize]; 
    database = Join @@ Quiet@Table[Normal@gbif[speciesName, "OccurrenceGeoRange" -> GeoBounds["World"], "FirstItem" -> i*batchSize, MaxItems -> batchSize], {i, 0, nBatches - 1}]; 
    DeleteMissing[Lookup[database, "GeoPosition"]]]
In[]:= 
   locsCCGBIF = GBIFFuncLocs["Cyrtophora citricola"];
In[]:= GeoListPlot[locs, GeoBackground -> "VectorVintage", PlotMarkers -> {Graphics[{StandardPurple, Disk[]}], 4}, GeoRange -> "World"]

1t594h1x7vbnt

This map shows way more occurrences in Africa! Also a few points in northern Australia.

Now let's look at Mexico in particular.

0dwzrjrpd0gip

1vpojovhqzncw

According to iNaturalist, there have been some reports of Cyrtophora in Mexico, but most are misidentifications. In the map above, the red dot on the Mexican southern border is definitely a different spider.

So last year, I was in Tapachula, in the state of Chiapas that borders Guatemala, and as we were going to the mosquito institute, I spotted a hazy cloud of interconnected webs on the powerlines. I have spent so much time looking at citricola webs that it was immediately obvious to me that finally citricola had come to Mexico. At first glance they look similar to the webs of Metepeira, but even though I got the briefest glimpse, I was quite sure. Later, I walked to the spot and peered up at them. They were so high up that I couldn't get a good look, and so I spent some time looking at the undergrowth and the avenue trees, and I was incredibly lucky to spot a young subadult in its web among the leaves. One look and it was confirmed; citricola is indeed in Mexico.

1cyiekm5su65r

In[]:= 
In[]:= ImageCollage[imgs]

1s3bvt6rzw5tr Medium

Using my Apple watch, I registered these coordinates as waypoints. Let's see where they fall on the map.

In[]:= tapPts = {{14.8877, -92.27775}, {14.8876, -92.27797}, {14.89006, -92.27642}}
Out[]= {{14.8877, -92.2778}, {14.8876, -92.278}, {14.8901, -92.2764}}

0crjd3w9qslez

1r8oyjybbq24g

And finally, here's a good photo of the subadult to confirm that indeed it is Cyrtophora citricola.

1plijh39si99p

0bo9t2j1c7nvp

References

  1. Rao, D. and Poyyamoli, G., 2001. Role of structural requirements in web-site selection in Cyrtophora cicatrosa Stoliczka (Araneae: Araneidae). Current Science, 81(6), p.678.
  2. Segura-Hernández, L., Barrantes, G., Chacón-Madrigal, E. and García-Rodríguez, A., 2023. Species distribution models and climatic niche comparisons provide clues on the geographic origin of a spider invasion in the Americas. Biological Invasions, 25(1), pp.251-265.
  3. Cyrtophora citricola (Forsskål, 1775) in GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset https://doi.org/10.15468/39omei accessed via GBIF.org on 2026-03-13.
  4. iNaturalist community. Observations of Cyrtophora cicatrosa observed on 2026-03-13.. Exported from https://www.inaturalist.org on 2026-03-13.
  5. iNaturalist community. Observations of Cyrtophora citricola observed on 2026-03-13.. Exported from https://www.inaturalist.org on 2026-03-13.

Misc. notes

Note on LLM use I'm still learning to use Wolfram Language/Mathematica in my work. To help me resolve coding issues, I used both Wolfram LLM (to fix formatting or import problems) and Claude AI (to build the functions). My workflow is generally to try to do it myself, and if it fails and I can't figure it out, I ask the LLMs to fix the code, or to suggest simpler/more concise ways to do the task. The wolfram notebook file is here.