Physics Tree
July 13, 2025While reading a book about the life of J. Robert Oppenheimer, I had a realization. To provide some context: he was a brilliant physicist who, despite never receiving the Nobel Prize in Physics, made groundbreaking contributions to particle physics, nuclear physics, and astrophysics.
One detail that particularly struck me was his 1930 paper (10.1103/PhysRev.35.562) discussing Paul Dirac's proposition that electrons could have both a positive charge and negative energy (10.1098/rspa.1930.0013). Dirac initially assumed this to be the proton, but Oppenheimer proposed the existence of a different particle, what would later be observed by Carl Anderson as the positron, a particle with the same mass as the electron but an opposite charge (10.1103/PhysRev.43.491). I could very easily go on about this discovery, as it's a great example of what I'd call elegant physics, but I'll leave that for another post.
The realization I had, which I mentioned in the first sentence, was that Oppenheimer was surrounded by brilliant minds: his mentors included Max Born, Joseph John Thomson, Paul Ehrenfest, and Wolfgang Pauli, while his colleagues were figures like Niels Bohr, Robert Serber, David Bohm, Hans Bethe, and Enrico Fermi, and I'm probably forgetting many others.
The formation of circles of brilliant minds is hardly unique to modern science. History offers countless examples of how intellectual brilliance tends to cluster. In literature, for instance, 17th-century writer Madeleine de Scudéry famously hosted salons that brought together luminaries such as François de Malherbe, Jean-Louis Guez de Balzac, and Madame de Sévigné. A few centuries later, Anna de Noailles engaged in literary conversations with the likes of Marcel Proust, Colette, Jean Cocteau, and Paul Valéry. The same pattern appears in the world of music. Joseph Haydn mentored Ludwig van Beethoven; Antonio Salieri taught Franz Schubert; and Nikolai Rimsky-Korsakov guided both Igor Stravinsky and Sergei Prokofiev.
But in the case of physics, there's a particularly interesting tool available: Physics Tree . This website allows you to search for a well-known physicist and explore their academic lineage. What makes it especially useful is that it doesn't stop at just the immediate mentor or student. It often traces multiple generations, revealing as much of the academic ancestry or descendants as possible.
I decided to try it with J. Robert Oppenheimer and got this result:
I was pleased to recognize many of the names I'd come across so far in the book, even though I'm only a quarter of the way through. Out of curiosity, I also tried the name of perhaps the most universally recognized physicist, Albert Einstein, and got this second result:
Note that these screenshots were taken using the browser's Inspect tool by selecting the appropriate element and choosing Screenshot Node.
It might be a bit of a stretch this time, but I was curious to see whether the result could be reproduced with Python. To be honest, I wasn't interested in using tools I was already familiar with, such as those associated with boosted decision trees. However, this constraint wasn't a problem, as I discovered that dedicated tools exist specifically for this task.
I chose to work with the Python library Graphviz. The original documentation gave me the impression that I needed to download the library manually. However, after a bit of research, I discovered that it was also possible to install it using pip, as detailed here. Therefore, I decided to set up a dedicated environment. As a reminder, it requires just two simple commands:
$ python3 -m venv venv
$ source venv/bin/activate
The Graphviz library can then be installed by typing pip install graphviz
.
This time, I wasn't aiming to replicate the exact diagrams I showed earlier, as they're quite large. Instead, I wanted to explore how easily a general family tree could be generated.
For example, the diagram above was produced using the following Python code:
from graphviz import Digraph
dot = Digraph()
dot.attr(rankdir="TB")
dot.node("P1", "P1")
dot.node("P2", "P2")
dot.node("Mid_up", "", shape="point", width="0.01", height="0.01")
dot.node("Mid_down", "", shape="point", width="0.01", height="0.01")
dot.node("Left_down", "", shape="point", width="0.01", height="0.01")
dot.node("Right_down", "", shape="point", width="0.01", height="0.01")
dot.node("C1", "C1")
dot.node("C2", "C2")
dot.node("C3", "C3")
dot.edge("P1", "Mid_up", arrowhead="none")
dot.edge("Mid_up", "P2", arrowhead="none")
dot.edge("Mid_up", "Mid_down", arrowhead="none")
dot.edge("Left_down", "Mid_down", arrowhead="none")
dot.edge("Mid_down", "Right_down", arrowhead="none")
dot.edge("Left_down", "C1", arrowhead="none", weight="10")
dot.edge("Mid_down", "C2", arrowhead="none", weight="10")
dot.edge("Right_down", "C3", arrowhead="none", weight="10")
with dot.subgraph() as s:
s.attr(rank="same")
s.node("P1")
s.node("Mid_up")
s.node("P2")
with dot.subgraph() as s:
s.attr(rank="same")
s.edge("Left_down", "Mid_down", style="invis")
s.edge("Mid_down", "Right_down", style="invis")
with dot.subgraph() as s:
s.attr(rank="same")
s.edge("C1", "C2", style="invis")
s.edge("C2", "C3", style="invis")
dot.render("family_1", format="svg", cleanup=True)
The code may appear lengthy, but it can be easily shortened if you don't require T-sections connecting the different entities. Using the same logic, I was able to create a more extended version of the earlier family tree:
Reproducing the lineage diagram shown would likely take some time and careful planning, but it's at least reassuring to know that it can be done.
There were two key elements that motivated me to write this post: the academic lineage of physicists and tree plotting with Python. But this also gives me an opportunity to pause and acknowledge the key figures whose contributions have made it possible to celebrate the 100th anniversary of quantum physics this year. My question now is: who knows what discoveries the next 100 years might bring?