Showing posts with label #dataviz. Show all posts
Showing posts with label #dataviz. Show all posts

Mar 3, 2025

Data Visualization of Double Itineraries: Schiele artwork and persecuted Jewish owner

Richard Lanyi was killed in the Holocaust but artworks, like this Schiele, from his collection ended up in museums.

This dataviz shows two itineraries: that of the paintings "Offenbarung" by Egon Schiele (on the top) and, connected to it, that of Richard Lanyi, who owned the artwork before being deported and murdered by Nazis in the Holocaust.


Below is the code to run in Google Colab

https://colab.research.google.com/drive/10eMNAVfg_v9t3ndttibBNzh2U1iKYl_a?usp=sharing

This Google Colab notebook will create a data visualization based on the provenance information published by the Austrian Commission at https://web.archive.org/web/20220703142133/https://www.bmkoes.gv.at/dam/jcr:2d092829-c6e9-43ae-9073-f8d77cb1d219/dossier_lanyi.pdf

You can replace the data in this file with your own data and run it.

(The python code was created by ChatGPT4O after a conversation involving a dozen iterative prompts.)

---


import matplotlib.pyplot as plt
import networkx as nx
import textwrap
from google.colab import files # Import files module for download

# Function to wrap text labels for better readability
def wrap_labels(labels, width=12):
return {k: "\n".join(textwrap.wrap(v, width)) for k, v in labels.items()}

# Define the ownership timeline of the artwork
ownerships = [
("Egon Schiele", "Dr. Hermann Engel"),
("Dr. Hermann Engel", "Richard Lanyi"),
("Richard Lanyi", "Hans Zernatto"),
("Hans Zernatto", "LB (Hans Zernatto's daughter)"),
("LB (Hans Zernatto's daughter)", "Rudolf Leopold"),
("Rudolf Leopold", "Leopold Museum")
]

# Define Richard Lanyi's persecution itinerary
lanyi_itinerary = [
("Richard Lanyi", "Nazi Targeting (1938)"),
("Nazi Targeting (1938)", "Bookstore Shut Down (1938)"),
("Bookstore Shut Down (1938)", "Johannes Katzler Takes Over (1938)"),
("Johannes Katzler Takes Over (1938)", "Financial Constraints (1938-1942)"),
("Financial Constraints (1938-1942)", "Gestapo Arrest (1942)"),
("Gestapo Arrest (1942)", "Deportation to Auschwitz (1942)"),
("Deportation to Auschwitz (1942)", "Murdered in Auschwitz (1942)")
]

# Define timeline years
timeline_years = [1910, 1920, 1930, 1940, 1950, 1960]

# Positioning nodes: Artwork ownership above, Lanyi's path below
owner_positions = {
"Egon Schiele": (1910, 2),
"Dr. Hermann Engel": (1920, 2),
"Richard Lanyi": (1930, 2),
"Hans Zernatto": (1940, 2),
"LB (Hans Zernatto's daughter)": (1950, 2),
"Rudolf Leopold": (1960, 2),
"Leopold Museum": (1970, 2)
}

# Adjusted Y positions for better readability and spacing of Lanyi's path
improved_lanyi_positions = {
"Nazi Targeting (1938)": (1938, -1),
"Bookstore Shut Down (1938)": (1938.5, -2),
"Johannes Katzler Takes Over (1938)": (1939, -3.2),
"Financial Constraints (1938-1942)": (1940, -4.5),
"Gestapo Arrest (1942)": (1942, -6),
"Deportation to Auschwitz (1942)": (1942.5, -7.5),
"Murdered in Auschwitz (1942)": (1943, -9)
}

# Merge both positions
positions = {**owner_positions, **improved_lanyi_positions}

# Wrap labels for better readability
wrapped_owner_labels = wrap_labels({node: node for node in owner_positions.keys()}, width=12)
wrapped_lanyi_labels = wrap_labels({node: node for node in improved_lanyi_positions.keys()}, width=20)

# Create graph
G = nx.DiGraph()
G.add_edges_from(ownerships, color="gray")
G.add_edges_from(lanyi_itinerary, color="darkred")

# Define edge colors
edge_colors = [G[u][v]['color'] for u, v in G.edges()]

# Create figure
plt.figure(figsize=(12, 12))

# Draw ownership path above the timeline
nx.draw_networkx_nodes(G, positions, nodelist=owner_positions.keys(), node_color="steelblue", node_size=3500, edgecolors="black")
nx.draw_networkx_edges(G, positions, edgelist=ownerships, edge_color="gray", arrows=True, width=2)
nx.draw_networkx_labels(G, positions, labels=wrapped_owner_labels, font_size=10, font_weight="bold", font_family="serif", font_color="white") # White text for better contrast

# Draw Lanyi's persecution path below the timeline with stronger visual impact
nx.draw_networkx_edges(G, positions, edgelist=lanyi_itinerary, edge_color="darkred", arrows=True, width=2.5, style="dashed")

# Display Lanyi’s persecution labels with bold emphasis
for node, (x, y) in improved_lanyi_positions.items():
plt.text(x, y, wrapped_lanyi_labels[node], fontsize=10, ha="center", fontweight="bold", color="darkred", fontfamily="serif")

# Draw the enhanced timeline with stronger markers
for year in timeline_years:
plt.scatter(year, 0, color="black", s=120) # Larger timeline markers
plt.text(year, 0.4, str(year), fontsize=11, ha="center", fontweight="bold", fontfamily="serif")

# Add dashed timeline line
plt.axhline(0, color="black", linestyle="dashed", linewidth=1.5)

# Title and annotations
plt.title("Itinerary of Egon Schiele's 'Offenbarung' (Above) and Richard Lanyi's Persecution (Below)",
fontsize=14, fontweight="bold", fontfamily="serif")

# Subtitle for context
plt.text(1925, 3, "Tracing the Fate of an Artwork and Its Jewish Collector", fontsize=12, fontweight="bold", color="black", fontfamily="serif")

# Final annotation to emphasize injustice
plt.text(1943, -10, "Richard Lanyi was murdered in Auschwitz in 1942.\nHis collection was lost to history.",
fontsize=11, fontweight="bold", color="darkred", fontfamily="serif", ha="center")

# Adjust display settings
plt.ylim(-10.5, 3.5) # Ensure spacing between sections
plt.xlim(1905, 1975)
plt.xticks([]) # Hide automatic ticks

# Save the figure to a file
filename = "Schiele_Offenbarung_Lanyi_Itinerary.png"
plt.savefig(filename, dpi=300, bbox_inches="tight")

# Show the plot
plt.show()

# Provide a download link for Google Colab users
files.download(filename)

Jan 7, 2022

Property looted from Jews in Vienna: Unser Wien MAP

http://maps.tacticalspace.org/unserwien/map.html


Behind every orange dot, property looted from Jews after the Nazi Anschluss of 1938

Map by Tactical Space, based on the inventory of stolen property under the Nazis, in the study by Stephan Templ, Unser Wien.accessed January 7, 2022

http://maps.tacticalspace.org/unserwien/map.html













http://maps.tacticalspace.org/unserwien/

Unser Wien Map

Unser Wien (Our Vienna) is a book co-authored by Stephan Templ and Tina Walzer that details how hundreds of Jewish businesses in Vienna were seized by the Nazis and never given back.

Continue to the map

Stephan Templ is an Austrian citizen, author, and journalist who has been jailed by Austria because of a restitution claim he made on behalf of his mother for Nazi-looted property.

This project is a translation of the addresses listed in the book as a digital map. This map is part of the Open Maps project. Credit for location entry and translation goes to Melanie Lyn. Technical implementation by Josh Harle.







Nov 16, 2020

Influence Networks: the Students of Paul Sachs and F. Lane Faison

 




Above: Some students of Paul Sachs and F. Lane Faison, along with a glimpse of some of the institutions where they studied or worked. (Wikidata Query November 16, 2020).  

(The graph misses a lot of data which has not yet been entered in Wikidata.)


https://w.wiki/mmw

Let's try to extend the graph to include some more information about the other teachers of Sach's and Lane's students













see Wikidata Query :
https://w.wiki/mn2 

Comments:
The datavisualization, while potentially interesting, is still clumsy and hard to read given the limits of a computer screen.
How can we zoom in on the networks we want to explore? 
How to transform a graph of this type into a truly useful tool for exploring networks of influence in the art world?
Is it by improving the underlying data, by improving the Wikidata query, or by switching to another more flexible, interactive tool for dataviz and navigation?

Could the addition of color help?