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