Wikidata Samian Ware Sites Visualisation¶

This notebook fetches Samian Ware data using a SPARQL query from Wikidata and creates bar charts.

Define SPARQL query service¶

In [3]:
from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd
import matplotlib.pyplot as plt

def querySparql(query):
    sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
    sparql.setQuery(query)
    sparql.setReturnFormat(JSON)
    results = sparql.queryAndConvert()
    return results['results']['bindings']

Define the SPARQL Query¶

In [4]:
# SPARQL Query for Samian Ware Kiln Sites
samianQuery = """
SELECT ?item ?samian ?itemLabel ?geo ?layerLabel ?layer ?kilnregion ?kilnregionLabel WHERE {
  ?item wdt:P31 wd:Q102202026;
    wdt:P361 wd:Q90412636;
    wdt:P706 ?kilnregion;
    wdt:P2888 ?samian;
    wdt:P625 ?geo;
    wdt:P706 ?layer.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
"""

Fetch Data and Convert to DataFrame¶

In [5]:
# Fetch data using the SPARQL query
sparql_results = querySparql(samianQuery)

# Convert SPARQL JSON results into a DataFrame
data = []
for result in sparql_results:
    geo = result.get('geo', {}).get('value', None)
    lat, lon = None, None
    if geo:
        coords = geo.replace("Point(", "").replace(")", "").split()
        if len(coords) == 2:
            lon, lat = map(float, coords)
    data.append({
        "item": result.get("item", {}).get("value", None),
        "itemLabel": result.get("itemLabel", {}).get("value", None),
        "layerLabel": result.get("layerLabel", {}).get("value", None),
        "kilnregionLabel": result.get("kilnregionLabel", {}).get("value", None),
        "latitude": lat,
        "longitude": lon,
    })

df = pd.DataFrame(data)
df
Out[5]:
item itemLabel layerLabel kilnregionLabel latitude longitude
0 http://www.wikidata.org/entity/Q103136249 Sagone (Samian Ware Productioncentre) Italian (Samian Ware Kilnregion) Italian (Samian Ware Kilnregion) 42.112142 8.702547
1 http://www.wikidata.org/entity/Q103136253 Albi (Samian Ware Productioncentre) South Gaulish (Samian Ware Kilnregion) South Gaulish (Samian Ware Kilnregion) 43.927186 2.149255
2 http://www.wikidata.org/entity/Q103136256 Rodez (Samian Ware Productioncentre) South Gaulish (Samian Ware Kilnregion) South Gaulish (Samian Ware Kilnregion) 44.352370 2.572616
3 http://www.wikidata.org/entity/Q102763431 La Graufesenque (Samian Ware Productioncentre) South Gaulish (Samian Ware Kilnregion) South Gaulish (Samian Ware Kilnregion) 44.100000 3.083333
4 http://www.wikidata.org/entity/Q103135455 Banassac (Samian Ware Productioncentre) South Gaulish (Samian Ware Kilnregion) South Gaulish (Samian Ware Kilnregion) 44.433333 3.200000
... ... ... ... ... ... ...
98 http://www.wikidata.org/entity/Q103136223 Torrita di Siena (Samian Ware Productioncentre) Italian (Samian Ware Kilnregion) Italian (Samian Ware Kilnregion) 43.166668 11.766666
99 http://www.wikidata.org/entity/Q103136227 Vasanello (Samian Ware Productioncentre) Italian (Samian Ware Kilnregion) Italian (Samian Ware Kilnregion) 42.416699 12.350000
100 http://www.wikidata.org/entity/Q103136235 Venosa (Samian Ware Productioncentre) Italian (Samian Ware Kilnregion) Italian (Samian Ware Kilnregion) 40.966667 15.816667
101 http://www.wikidata.org/entity/Q103136239 Micasasa (Samian Ware Productioncentre) Dacian (Samian Ware Kilnregion) Dacian (Samian Ware Kilnregion) 46.086660 24.108056
102 http://www.wikidata.org/entity/Q103136244 Lyon (Samian Ware Productioncentre) Italian (Samian Ware Kilnregion) Italian (Samian Ware Kilnregion) 45.760000 4.840000

103 rows × 6 columns

Visualise the Data with Charts¶

In [6]:
# Count sites by region and layer for stacked bar chart
region_layer_counts = df.groupby(["kilnregionLabel", "layerLabel"]).size().unstack(fill_value=0)

# Create pie chart data
region_counts = df["kilnregionLabel"].value_counts()

# Stacked Bar Chart
plt.figure(figsize=(12, 8))
region_layer_counts.plot(kind="bar", stacked=True, figsize=(12, 8), colormap="tab20")
plt.title("Distribution of Kiln Sites by Region and Layer", fontsize=16)
plt.xlabel("Kiln Region", fontsize=14)
plt.ylabel("Number of Sites", fontsize=14)
plt.xticks(rotation=45, ha="right")
plt.legend(title="Layer", bbox_to_anchor=(1.05, 1), loc="upper left")
plt.tight_layout()
plt.show()
<Figure size 1200x800 with 0 Axes>
No description has been provided for this image
In [7]:
# Pie Chart
plt.figure(figsize=(10, 10))
region_counts.plot(kind="pie", autopct="%1.1f%%", startangle=90, colors=plt.cm.Paired.colors)
plt.title("Proportion of Kiln Sites by Region", fontsize=16)
plt.ylabel("")  # Remove default ylabel
plt.tight_layout()
plt.show()
No description has been provided for this image