The Rhythm of the European Vote: Exploring ESC Winners with Nested Line Diagrams in ConceptFlow
Authors: Anurag Sharma, Marcel Nöhre and Gerd Stumme
Reading time: 26 min
Keywords: Formal Concept Analysis, Nested Line Diagrams, Eurovision Song Contest, ConceptFlow
The Eurovision Song Contest (ESC) is one of the largest annual music competitions in the world. Beyond the performances themselves, its voting patterns have attracted considerable attention for decades, with recurring regional, cultural, historical, and political relationships often emerging between participating countries [3]. But winning songs also share something else: musical characteristics like tempo and key. This raises a natural question: is there a meaningful relationship between how a song is supported and what it actually sounds like?
Formal Concept Analysis (FCA) provides a natural framework for studying this question. Rather than trying to predict outcomes, FCA identifies combinations of attributes that occur together — and equally importantly, which combinations never do. These cooccurrences (and absences) can be expressed as implications, revealing dependencies between voting behaviour and musical characteristics.
To automate this kind of analysis, we built ConceptFlow [6], a scikit-learn-compatible Python library for Formal Concept Analysis. One of its core visualization tools is the nested line diagram, which layers multiple conceptual scales into a single interactive view. Here, the outer scale represents different notions of voting support, while the inner scale captures musical characteristics of winning songs.
This post accompanies our work, Exploring ESC Winners with Nested Diagrams, but takes a much more detailed and interactive approach. We’ll walk through the FCA concepts behind nested line diagrams, introduce the ESC winners dataset and the voting clusters we used, show how ConceptFlow constructs the visualization, and dig into every implication the data revealed. Along the way, you will be able to explore the interactive nested line diagram yourself.
Background
Before diving into the ESC dataset, let’s briefly cover the FCA concepts needed to understand nested line diagrams [2].
A formal context is a triple (G, M, I) consisting of a set G of objects, a set M of attributes, and an incidence relation I ⊆ G × M indicating which objects possess which attributes. In practice, this is nothing more than a binary table: rows are objects, columns are attributes, and each cell tells you whether that attribute applies.
A formal concept is a pair (A, B), where A is a set of objects (the extent) and B is the set of attributes (the intent), such that A consists of exactly the objects sharing all attributes in B, and B consists of exactly the attributes shared by all objects in A. This mutual closure is what makes concepts maximal: you cannot add an object to A without losing an attribute from B, and vice versa.
If we order these concepts by extent inclusion, we get a concept lattice, which arranges concepts hierarchically from the most general to the most specific. A visualization of this complete lattice is a line diagram: each node is a formal concept, and each edge represents a covering relation in the lattice’s order (the transitive reduction of the partial order) connecting a concept only to those immediately above or below it, with no concept in between.
Nested line diagrams extend this idea by separating the attributes into multiple conceptual scales. Instead of building a single concept lattice over every attribute, we built a separate lattice for each scale. The outer lattice represents one group of attributes, and a copy of the inner lattice is placed inside every concept of the outer lattice. Filled nodes mark concepts that occur in the original context, whereas hollow nodes indicate implications, revealing combinations of attributes that never occur without additional conditions.
This kind of splitting only works because of a specific mathematical relationship between the two resulting contexts. When a formal context is divided into two disjoint groups of attributes over the same objects, the two parts are said to form an apposition. Ganter and Wille [2] showed that the concept lattice of the original, undivided context always embeds into the product of the two lattices built from each half of the apposition, an embedding known as a subdirect product. In practice, this guarantees that every concept in the full context corresponds to exactly one pairing of an outer concept and an inner concept, so we lose nothing by drawing the two lattices separately and simply marking which pairs actually occur together.
The ESC Winner Dataset
To demonstrate ConceptFlow and nested line diagrams, we analyse the winners of the ESC from 1975 to 2025, excluding the cancelled 2020 contest, resulting in a dataset of 50 winning entries. Restricting the analysis to winners keeps the resulting visualization compact and readable while focusing on the songs that successfully attracted support across Europe. The complete voting data and song metadata are obtained from the publicly available ESC dataset (GitHub repository).
Voting and musical data
For every winning song, we collect two complementary types of information. The first describes how the song was supported. Before 2016, ESC published a single combined voting result; from 2016 onward, jury and public televote results have been reported separately. To get one consistent voting profile per winner, we follow the same approach as in the accompanying paper: for contests before 2016, we use the combined result, and for later contests, we take whichever of the jury or televote awarded the larger total number of points. The second type of information describes what the song actually sounds like. For each winner, we record its tempo in beats per minute (BPM) along with its musical key.
The outer scale: voting support
The outer scale captures whether a winning entry received strong support from four complementary perspectives of ESC voting:
| Type | Description |
|---|---|
| Regional | Geographical proximity |
| Cultural | Shared language and cultural affinity |
| Historical | Historical ties and shared past |
| Political | Political and economic alliances |
Unlike data-driven clustering methods, these taxonomies were constructed manually to reflect commonly discussed sources of ESC voting affinity [7]. Within each taxonomy, countries are assigned to exactly one cluster. For every taxonomy, support is computed the same way. We identify the winner’s corresponding cluster, consider only the countries within that cluster that were eligible to vote that year, compute the average number of points they awarded the winner, and assign the corresponding Boolean support attribute whenever this average reaches at least eight points. This threshold follows naturally from ESC’s scoring system. Countries award points in a regular sequence from 1 to 8, then jump directly to 10 and 12 for their most favoured entries. An average of eight therefore sits at the very top of the ordinary scoring range, just before that jump, marking a natural boundary between routine support and the disproportionately generous scores a cluster reserves for its clear favourites.
Regional support

Countries are grouped according to geographical proximity:
| Cluster | Members |
|---|---|
| British Isles | United Kingdom, Wales, Ireland |
| Scandinavia | Denmark, Finland, Iceland, Norway, Sweden |
| Baltic States | Estonia, Latvia, Lithuania |
| Benelux | Belgium, Netherlands, Luxembourg |
| Iberian Peninsula | Andorra, Spain, France, Portugal |
| Central Europe | Austria, Switzerland, Czechia, Germany, Hungary, Poland, Slovakia |
| Mediterranean | Italy, Monaco, Malta, San Marino |
| Balkans | Albania, Bosnia & Herzegovina, Cyprus, Greece, Croatia, Montenegro, North Macedonia, Serbia, Slovenia, Türkiye, Yugoslavia, Serbia & Montenegro |
| Eastern Europe | Belarus, Bulgaria, Moldova, Romania, Russia, Ukraine |
| Caucasus | Armenia, Azerbaijan, Georgia |
| Non-European | Australia, Israel, Kazakhstan, Morocco |
Cultural support

Countries are grouped by linguistic and cultural similarity:
| Cluster | Members |
|---|---|
| Anglophone | Australia, United Kingdom, Wales, Ireland |
| Nordic | Denmark, Finland, Iceland, Norway, Sweden |
| Baltic | Estonia, Latvia, Lithuania |
| Germanic | Austria, Belgium, Switzerland, Germany, Luxembourg, Netherlands |
| Romance | Andorra, France, Italy, Monaco, Moldova, Malta, Portugal, Romania, San Marino, Spain |
| East-Central Europe | Czechia, Hungary, Poland, Slovakia, Slovenia, Croatia |
| East Slavic | Belarus, Russia, Ukraine |
| Balkan | Albania, Bosnia & Herzegovina, Bulgaria, Montenegro, North Macedonia, Serbia, Yugoslavia, Serbia & Montenegro |
| Hellenic | Cyprus, Greece |
| Turkic | Azerbaijan, Kazakhstan, Türkiye |
| Caucasian | Armenia, Georgia |
| Semitic | Israel, Morocco |
Historical support

Historical support reflects historical ties and shared past, particularly the groupings shaped by the Cold War and the breakup of Yugoslavia:
| Cluster | Members |
|---|---|
| Former Soviet Union | Armenia, Azerbaijan, Belarus, Estonia, Georgia, Kazakhstan, Latvia, Lithuania, Moldova, Russia, Ukraine |
| Former Yugoslavia | Bosnia & Herzegovina, Croatia, Montenegro, North Macedonia, Serbia, Slovenia, Yugoslavia, Serbia & Montenegro |
| Former Eastern Bloc | Albania, Bulgaria, Czechia, Hungary, Poland, Romania, Slovakia |
| Western Bloc | Australia, Belgium, Denmark, France, Germany, Greece, Iceland, Israel, Italy, Luxembourg, Netherlands, Norway, Portugal, Spain, Türkiye, United Kingdom, Wales |
| Neutral | Andorra, Austria, Switzerland, Finland, Ireland, Monaco, San Marino, Sweden |
| Non-Aligned Movement | Cyprus, Malta, Morocco |
Political support

Political support reflects political and economic alliances, grouping countries according to their present-day affiliations:
| Cluster | Members |
|---|---|
| EU Eurozone | Austria, Belgium, Bulgaria, Croatia, Cyprus, Estonia, Finland, France, Germany, Greece, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Portugal, Slovakia, Slovenia, Spain |
| EU Non-Eurozone | Czechia, Denmark, Hungary, Poland, Romania, Sweden |
| EU Candidates | Albania, Bosnia & Herzegovina, Georgia, Moldova, Montenegro, North Macedonia, Serbia, Türkiye, Ukraine |
| EFTA / EEA | Switzerland, Iceland, Norway |
| Post-Brexit | United Kingdom, Wales |
| Eurasian Economic Union | Armenia, Belarus, Kazakhstan, Russia |
| Non-aligned | Andorra, Azerbaijan, Monaco, San Marino |
| Non-European | Australia, Israel, Morocco |
| Defunct States | Yugoslavia, Serbia & Montenegro |
The inner scale: musical characteristics
The inner scale describes two musical properties of each winning song. Tempo is transformed using an ordinal threshold scale with thresholds at 100 BPM and 150 BPM, yielding the attributes tempo ≥ 100 BPM and tempo ≥ 150 BPM. Songs below 100 BPM satisfy neither threshold, songs between 100 and 149 BPM satisfy only the first threshold, and songs with a tempo of at least 150 BPM satisfy both attributes. These thresholds follow previous work on the perception of musical tempo [4]. Musical key is represented using a dichotomic scale with the mutually exclusive attributes major and minor.
A sample of the dataset
The resulting many-valued context contains one object for each ESC winner. Throughout this post, countries are identified by both their full name and the corresponding two-letter country code. In the interactive nested line diagram, objects are labelled using the country code together with the winning year. A small sample of the dataset is shown below:
| Year | Country | Regional | Cultural | Historical | Political | BPM | Key |
|---|---|---|---|---|---|---|---|
| 1975 | Netherlands (NL) | 139 | Major | ||||
| 1976 | United Kingdom (GB) | × | 97 | Major | |||
| 1977 | France (FR) | × | 125 | Minor | |||
| … | … | … | … | … | … | … | … |
| 2024 | Switzerland (CH) | × | × | × | × | 160 | Minor |
| 2025 | Austria (AT) | × | × | × | 133 | Minor |
» Click here to view the full table of the many-valued context (all 50 winners) «
| Year | Country | Regional | Cultural | Historical | Political | BPM | Key |
|---|---|---|---|---|---|---|---|
| 1975 | Netherlands (NL) | 139 | Major | ||||
| 1976 | United Kingdom (GB) | × | 97 | Major | |||
| 1977 | France (FR) | × | 125 | Minor | |||
| 1978 | Israel (IL) | × | 145 | Minor | |||
| 1979 | Israel (IL) | 141 | Major | ||||
| 1980 | Ireland (IE) | × | × | × | × | 97 | Major |
| 1981 | United Kingdom (GB) | × | × | 178 | Major | ||
| 1982 | Germany (DE) | × | × | 118 | Minor | ||
| 1983 | Luxembourg (LU) | × | 142 | Minor | |||
| 1984 | Sweden (SE) | × | × | × | × | 131 | Major |
| 1985 | Norway (NO) | × | × | 148 | Major | ||
| 1986 | Belgium (BE) | × | × | × | 139 | Major | |
| 1987 | Ireland (IE) | × | × | × | × | 151 | Major |
| 1988 | Switzerland (CH) | 144 | Major | ||||
| 1989 | Yugoslavia (YU) | 147 | Major | ||||
| 1990 | Italy (IT) | × | × | 102 | Major | ||
| 1991 | Sweden (SE) | × | × | × | 93 | Major | |
| 1992 | Ireland (IE) | × | × | × | 78 | Major | |
| 1993 | Ireland (IE) | × | × | × | 139 | Major | |
| 1994 | Ireland (IE) | × | × | × | × | 124 | Major |
| 1995 | Norway (NO) | × | 81 | Minor | |||
| 1996 | Ireland (IE) | × | 125 | Major | |||
| 1997 | United Kingdom (GB) | × | × | × | 166 | Major | |
| 1998 | Israel (IL) | × | 134 | Minor | |||
| 1999 | Sweden (SE) | × | × | × | 144 | Major | |
| 2000 | Denmark (DK) | × | × | × | 104 | Major | |
| 2001 | Estonia (EE) | × | × | × | × | 124 | Major |
| 2002 | Latvia (LV) | × | × | × | × | 144 | Minor |
| 2003 | Türkiye (TR) | × | × | 95 | Major | ||
| 2004 | Ukraine (UA) | × | × | × | 172 | Major | |
| 2005 | Greece (GR) | × | × | 113 | Minor | ||
| 2006 | Finland (FI) | × | × | × | × | 123 | Minor |
| 2007 | Serbia (RS) | × | × | 152 | Major | ||
| 2008 | Russia (RU) | × | × | × | × | 133 | Major |
| 2009 | Norway (NO) | × | × | × | × | 108 | Minor |
| 2010 | Germany (DE) | × | × | 95 | Major | ||
| 2011 | Azerbaijan (AZ) | × | × | 86 | Major | ||
| 2012 | Sweden (SE) | × | × | × | × | 132 | Major |
| 2013 | Denmark (DK) | × | × | × | × | 111 | Minor |
| 2014 | Austria (AT) | × | × | × | 164 | Minor | |
| 2015 | Sweden (SE) | × | × | × | × | 124 | Major |
| 2016 | Ukraine (UA) | × | × | × | 120 | Minor | |
| 2017 | Portugal (PT) | × | × | × | × | 172 | Major |
| 2018 | Israel (IL) | × | × | 130 | Minor | ||
| 2019 | Netherlands (NL) | × | × | 143 | Major | ||
| 2021 | Italy (IT) | × | × | × | 103 | Minor | |
| 2022 | Ukraine (UA) | × | × | × | 105 | Minor | |
| 2023 | Sweden (SE) | × | × | × | × | 150 | Minor |
| 2024 | Switzerland (CH) | × | × | × | × | 160 | Minor |
| 2025 | Austria (AT) | × | × | × | 133 | Minor |
» Click here to view the full table of the scaled dataset (all 50 winners) «
| Year | Country | Regional | Cultural | Historical | Political | ≥100 BPM | ≥150 BPM | Major | Minor |
|---|---|---|---|---|---|---|---|---|---|
| 1975 | Netherlands (NL) | × | × | ||||||
| 1976 | United Kingdom (GB) | × | × | ||||||
| 1977 | France (FR) | × | × | × | |||||
| 1978 | Israel (IL) | × | × | × | |||||
| 1979 | Israel (IL) | × | × | ||||||
| 1980 | Ireland (IE) | × | × | × | × | × | |||
| 1981 | United Kingdom (GB) | × | × | × | × | × | |||
| 1982 | Germany (DE) | × | × | × | × | ||||
| 1983 | Luxembourg (LU) | × | × | × | |||||
| 1984 | Sweden (SE) | × | × | × | × | × | × | ||
| 1985 | Norway (NO) | × | × | × | × | ||||
| 1986 | Belgium (BE) | × | × | × | × | × | |||
| 1987 | Ireland (IE) | × | × | × | × | × | × | × | |
| 1988 | Switzerland (CH) | × | × | ||||||
| 1989 | Yugoslavia (YU) | × | × | ||||||
| 1990 | Italy (IT) | × | × | × | × | ||||
| 1991 | Sweden (SE) | × | × | × | × | ||||
| 1992 | Ireland (IE) | × | × | × | × | ||||
| 1993 | Ireland (IE) | × | × | × | × | × | |||
| 1994 | Ireland (IE) | × | × | × | × | × | × | ||
| 1995 | Norway (NO) | × | × | ||||||
| 1996 | Ireland (IE) | × | × | × | |||||
| 1997 | United Kingdom (GB) | × | × | × | × | × | × | ||
| 1998 | Israel (IL) | × | × | × | |||||
| 1999 | Sweden (SE) | × | × | × | × | × | |||
| 2000 | Denmark (DK) | × | × | × | × | × | |||
| 2001 | Estonia (EE) | × | × | × | × | × | × | ||
| 2002 | Latvia (LV) | × | × | × | × | × | × | ||
| 2003 | Türkiye (TR) | × | × | × | |||||
| 2004 | Ukraine (UA) | × | × | × | × | × | × | ||
| 2005 | Greece (GR) | × | × | × | × | ||||
| 2006 | Finland (FI) | × | × | × | × | × | × | ||
| 2007 | Serbia (RS) | × | × | × | × | × | |||
| 2008 | Russia (RU) | × | × | × | × | × | × | ||
| 2009 | Norway (NO) | × | × | × | × | × | × | ||
| 2010 | Germany (DE) | × | × | × | |||||
| 2011 | Azerbaijan (AZ) | × | × | × | |||||
| 2012 | Sweden (SE) | × | × | × | × | × | × | ||
| 2013 | Denmark (DK) | × | × | × | × | × | × | ||
| 2014 | Austria (AT) | × | × | × | × | × | × | ||
| 2015 | Sweden (SE) | × | × | × | × | × | × | ||
| 2016 | Ukraine (UA) | × | × | × | × | × | |||
| 2017 | Portugal (PT) | × | × | × | × | × | × | × | |
| 2018 | Israel (IL) | × | × | × | × | ||||
| 2019 | Netherlands (NL) | × | × | × | × | ||||
| 2021 | Italy (IT) | × | × | × | × | × | |||
| 2022 | Ukraine (UA) | × | × | × | × | × | |||
| 2023 | Sweden (SE) | × | × | × | × | × | × | × | |
| 2024 | Switzerland (CH) | × | × | × | × | × | × | × | |
| 2025 | Austria (AT) | × | × | × | × | × |
» Click here to view the full table of the outer formal context (all 50 winners) «
| Year | Country | Regional | Cultural | Historical | Political |
|---|---|---|---|---|---|
| 1975 | Netherlands (NL) | ||||
| 1976 | United Kingdom (GB) | × | |||
| 1977 | France (FR) | × | |||
| 1978 | Israel (IL) | × | |||
| 1979 | Israel (IL) | ||||
| 1980 | Ireland (IE) | × | × | × | × |
| 1981 | United Kingdom (GB) | × | × | ||
| 1982 | Germany (DE) | × | × | ||
| 1983 | Luxembourg (LU) | × | |||
| 1984 | Sweden (SE) | × | × | × | × |
| 1985 | Norway (NO) | × | × | ||
| 1986 | Belgium (BE) | × | × | × | |
| 1987 | Ireland (IE) | × | × | × | × |
| 1988 | Switzerland (CH) | ||||
| 1989 | Yugoslavia (YU) | ||||
| 1990 | Italy (IT) | × | × | ||
| 1991 | Sweden (SE) | × | × | × | |
| 1992 | Ireland (IE) | × | × | × | |
| 1993 | Ireland (IE) | × | × | × | |
| 1994 | Ireland (IE) | × | × | × | × |
| 1995 | Norway (NO) | × | |||
| 1996 | Ireland (IE) | × | |||
| 1997 | United Kingdom (GB) | × | × | × | |
| 1998 | Israel (IL) | × | |||
| 1999 | Sweden (SE) | × | × | × | |
| 2000 | Denmark (DK) | × | × | × | |
| 2001 | Estonia (EE) | × | × | × | × |
| 2002 | Latvia (LV) | × | × | × | × |
| 2003 | Türkiye (TR) | × | × | ||
| 2004 | Ukraine (UA) | × | × | × | |
| 2005 | Greece (GR) | × | × | ||
| 2006 | Finland (FI) | × | × | × | × |
| 2007 | Serbia (RS) | × | × | ||
| 2008 | Russia (RU) | × | × | × | × |
| 2009 | Norway (NO) | × | × | × | × |
| 2010 | Germany (DE) | × | × | ||
| 2011 | Azerbaijan (AZ) | × | × | ||
| 2012 | Sweden (SE) | × | × | × | × |
| 2013 | Denmark (DK) | × | × | × | × |
| 2014 | Austria (AT) | × | × | × | |
| 2015 | Sweden (SE) | × | × | × | × |
| 2016 | Ukraine (UA) | × | × | × | |
| 2017 | Portugal (PT) | × | × | × | × |
| 2018 | Israel (IL) | × | × | ||
| 2019 | Netherlands (NL) | × | × | ||
| 2021 | Italy (IT) | × | × | × | |
| 2022 | Ukraine (UA) | × | × | × | |
| 2023 | Sweden (SE) | × | × | × | × |
| 2024 | Switzerland (CH) | × | × | × | × |
| 2025 | Austria (AT) | × | × | × |
» Click here to view the full table of the inner formal context (all 50 winners) «
| Year | Country | ≥100 BPM | ≥150 BPM | Major | Minor |
|---|---|---|---|---|---|
| 1975 | Netherlands (NL) | × | × | ||
| 1976 | United Kingdom (GB) | × | |||
| 1977 | France (FR) | × | × | ||
| 1978 | Israel (IL) | × | × | ||
| 1979 | Israel (IL) | × | × | ||
| 1980 | Ireland (IE) | × | |||
| 1981 | United Kingdom (GB) | × | × | × | |
| 1982 | Germany (DE) | × | × | ||
| 1983 | Luxembourg (LU) | × | × | ||
| 1984 | Sweden (SE) | × | × | ||
| 1985 | Norway (NO) | × | × | ||
| 1986 | Belgium (BE) | × | × | ||
| 1987 | Ireland (IE) | × | × | × | |
| 1988 | Switzerland (CH) | × | × | ||
| 1989 | Yugoslavia (YU) | × | × | ||
| 1990 | Italy (IT) | × | × | ||
| 1991 | Sweden (SE) | × | |||
| 1992 | Ireland (IE) | × | |||
| 1993 | Ireland (IE) | × | × | ||
| 1994 | Ireland (IE) | × | × | ||
| 1995 | Norway (NO) | × | |||
| 1996 | Ireland (IE) | × | × | ||
| 1997 | United Kingdom (GB) | × | × | × | |
| 1998 | Israel (IL) | × | × | ||
| 1999 | Sweden (SE) | × | × | ||
| 2000 | Denmark (DK) | × | × | ||
| 2001 | Estonia (EE) | × | × | ||
| 2002 | Latvia (LV) | × | × | ||
| 2003 | Türkiye (TR) | × | |||
| 2004 | Ukraine (UA) | × | × | × | |
| 2005 | Greece (GR) | × | × | ||
| 2006 | Finland (FI) | × | × | ||
| 2007 | Serbia (RS) | × | × | × | |
| 2008 | Russia (RU) | × | × | ||
| 2009 | Norway (NO) | × | × | ||
| 2010 | Germany (DE) | × | |||
| 2011 | Azerbaijan (AZ) | × | |||
| 2012 | Sweden (SE) | × | × | ||
| 2013 | Denmark (DK) | × | × | ||
| 2014 | Austria (AT) | × | × | × | |
| 2015 | Sweden (SE) | × | × | ||
| 2016 | Ukraine (UA) | × | × | ||
| 2017 | Portugal (PT) | × | × | × | |
| 2018 | Israel (IL) | × | × | ||
| 2019 | Netherlands (NL) | × | × | ||
| 2021 | Italy (IT) | × | × | ||
| 2022 | Ukraine (UA) | × | × | ||
| 2023 | Sweden (SE) | × | × | × | |
| 2024 | Switzerland (CH) | × | × | × | |
| 2025 | Austria (AT) | × | × |
Across all 50 winners, 33 received regional support, 34 cultural support, 32 historical support, and 29 political support. The musical attributes consist of 31 songs in major keys and 19 in minor keys. Based on the selected tempo thresholds, the dataset contains 8 slow songs (below 100 BPM), 33 medium-tempo songs (100–149 BPM), and 9 fast songs (150 BPM or above). With the dataset defined, we can now construct the corresponding nested line diagram and explore the relationships it reveals.
Interactive Nested Line Diagram
The visualization can be explored directly: select a node to inspect its objects and attributes, hover over nodes to emphasize their connections, and open an outer node to examine its inner lattice in more detail.
The outer lattice
The large structure forms the outer lattice, representing the four types of voting support: regional, cultural, historical, and political. The top concept contains all 50 winners, without requiring any particular type of support. Moving downward introduces increasingly specific combinations of support attributes, until we reach the bottom concept, containing the 15 winners who received support from all four taxonomies.
The inner lattice
Each outer concept contains a copy of the same inner lattice, representing tempo and key. This inner lattice consists of ten concepts derived from the BPM thresholds and the distinction between major and minor keys. Its layout stays identical inside every outer node; only the filled nodes change. This makes it possible to compare musical patterns across different voting-support concepts simply by looking at the same position in each inner lattice. A filled inner node indicates that, together with the surrounding outer concept, it corresponds to a concept of the complete context. A hollow node indicates that this particular combination of outer and inner concepts doesn’t occur.
Implications
Every hollow node is potentially an implication. Here’s how to read one:
- Find the hollow node you are curious about.
- Look for the largest filled node directly below it, first inside the same inner lattice, and if there’s no candidate there, in a smaller outer group (one with a stricter combination of voting-support flags).
- Whatever extra attributes that filled node carries, beyond those already given by the hollow node’s own position, form the conclusion of an implication whose premise is the hollow node’s position.
Try this directly in the diagram above before reading on: the implications described in the next section can all be located this way.
What Can We Learn?
For the combined ESC winner context, the Duquenne-Guigues basis, the smallest set of implications from which every other true implication in the context can be derived, consists of eight implications. Some arise from the structure of the conceptual scales themselves. For example, every song with a tempo of at least 150 BPM also satisfies the attribute BPM ≥ 100, and every song is either in a major or minor key. The remaining implications reveal relationships between voting support and musical characteristics observed in the dataset.
Implication 1: Fast winners receive cultural support
BPM ≥ 150 → Cultural support
The first implication states that every winning song with a tempo of at least 150 BPM also received cultural support. This applies to nine winners spanning more than four decades: 1981 (United Kingdom), 1987 (Ireland), 1997 (United Kingdom), 2004 (Ukraine), 2007 (Serbia), 2014 (Austria), 2017 (Portugal), 2023 (Sweden), and 2024 (Switzerland).
Although these winners represent a wide range of musical styles, none violates this rule. Whether this reflects a broader characteristic of ESC or simply the composition of the winner dataset would require a larger study including non-winning entries.
Implications 2–4: Minor-key songs with voting support are never slow
Regional support ∧ Minor key → BPM ≥ 100
Cultural support ∧ Minor key → BPM ≥ 100
Historical support ∧ Minor key → BPM ≥ 100
These three implications share the same structure. Together they show that whenever a minor-key winner received regional, cultural, or historical support, the song was never slow. In other words, no winner in the dataset combines a minor key, a tempo below 100 BPM, and one of these three forms of voting support.
- Regional support: 2002 (Latvia), 2005 (Greece), 2006 (Finland), 2009 (Norway), 2013 (Denmark), 2016 (Ukraine), 2018 (Israel), 2021 (Italy), 2022 (Ukraine), 2023 (Sweden), 2024 (Switzerland)
- Cultural support: 2002 (Latvia), 2005 (Greece), 2006 (Finland), 2009 (Norway), 2013 (Denmark), 2014 (Austria), 2016 (Ukraine), 2021 (Italy), 2023 (Sweden), 2024 (Switzerland), 2025 (Austria)
- Historical support: 1978 (Israel), 1982 (Germany), 1998 (Israel), 2002 (Latvia), 2006 (Finland), 2009 (Norway), 2013 (Denmark), 2014 (Austria), 2016 (Ukraine), 2022 (Ukraine), 2023 (Sweden), 2024 (Switzerland), 2025 (Austria)
Implications 6–8: Relationships between voting support and musical characteristics
Political support ∧ Historical support ∧ Major → Regional support
Political support ∧ Cultural support ∧ BPM ≥ 150 → Historical support
Cultural support ∧ BPM ≥ 150 ∧ Minor → Political support ∧ Historical support
The remaining non-trivial implications involve relatively small groups of winners but illustrate another strength of nested line diagrams: relationships between musical characteristics and multiple notions of voting support become visible simultaneously. Some of these dependencies likely reflect overlap between the manually constructed voting taxonomies, while others arise from the limited size of the winner dataset.
- Regional support: 1980 (Ireland), 1984 (Sweden), 1986 (Belgium), 1987 (Ireland), 1994 (Ireland), 2001 (Estonia), 2008 (Russia), 2012 (Sweden), 2015 (Sweden), 2017 (Portugal)
- Historical support: 1987 (Ireland), 2014 (Austria), 2017 (Portugal), 2023 (Sweden), 2024 (Switzerland)
- Political support, Historical support: 2014 (Austria), 2023 (Sweden), 2024 (Switzerland)
As before, each of these can be located directly in the diagram by comparing the corresponding nodes across different outer concepts.
Implication 5: A structural implication
Major ∧ Minor → Everything
The fifth implication does not describe ESC itself. Its premise is impossible because every song is either in a major or minor key. Such vacuous implications naturally appear in canonical implication bases and simply reflect the structure of the conceptual scales rather than properties of the underlying data.
» Click here to view the complete Duquenne-Guigues implication basis «
| # | Premise | Conclusion | Type | Winners |
|---|---|---|---|---|
| 1 | BPM ≥ 150 | Cultural support, BPM ≥ 100 | Inner → Outer + Inner | 9 |
| 2 | Regional support ∧ Minor | BPM ≥ 100 | Outer + Inner → Inner | 11 |
| 3 | Cultural support ∧ Minor | BPM ≥ 100 | Outer + Inner → Inner | 11 |
| 4 | Historical support ∧ Minor | BPM ≥ 100 | Outer + Inner → Inner | 13 |
| 5 | Major ∧ Minor | Political support, Regional support, Cultural support, Historical support, BPM ≥ 100, BPM ≥ 150 | Vacuous | 0 |
| 6 | Political support ∧ Historical support ∧ Major | Regional support | Outer + Inner → Outer | 10 |
| 7 | Political support ∧ Cultural support ∧ BPM ≥ 150 | Historical support | Outer + Inner → Outer | 5 |
| 8 | Cultural support ∧ BPM ≥ 150 ∧ Minor | Political support, Historical support | Outer + Inner → Outer | 3 |
How ConceptFlow Builds the Diagram
The nested line diagram shown above is generated automatically by ConceptFlow. Starting from the many-valued ESC winners dataset, the library transforms the data into two concept lattices, computes the filled nodes of the nested diagram, lays out the lattices using DimFlux, and finally generates a self-contained interactive visualization.
Many-valued context
↓
Conceptual scaling
↓
Outer and inner formal contexts
↓
Concept lattices
↓
Filled-node computation
↓
DimFlux layout
↓
JSON representation
↓
Interactive D3 visualization Step 1: Conceptual scaling
The ESC winners dataset contains ordinary tabular data such as Boolean values, numerical BPM values, and musical keys. Before FCA can be applied, these values must be transformed into binary attributes through conceptual scaling. For this example, the four voting-support attributes are generated using general scales, tempo is transformed using a threshold scale with breakpoints at 100 and 150 BPM, and key is represented using a dichotomic scale producing the mutually exclusive attributes major and minor. Applying these scales produces two formal contexts: an outer context describing voting support, and an inner context describing musical characteristics.
Step 2: Constructing the factor lattices
The outer and inner formal contexts are processed independently to construct their corresponding concept lattices. Since both contexts share the same set of ESC winners and use disjoint sets of attributes, they satisfy the assumptions required for nested line diagrams. ConceptFlow explicitly verifies this disjointness before constructing the diagram, since the filled-node computation described below is only valid for a genuine apposition.
Step 3: Computing the filled nodes
Rather than constructing the concept lattice of the combined context explicitly, ConceptFlow computes the filled nodes directly from the two factor lattices. For every winner, the corresponding object concepts are identified in both lattices, producing the initial set of coordinate pairs. These pairs are then closed under componentwise joins until no further pairs can be generated. By the subdirect product theorem, the resulting set is exactly the image of the combined concept lattice inside the product of the two factor lattices.
Step 4: Computing the layout
Once the two lattices have been constructed, ConceptFlow computes their layouts using DimFlux [5], which generates doubly-additive line diagrams optimized for readability. The outer lattice is laid out once, and the inner lattice is likewise laid out only once. The same inner layout is then reused inside every outer concept. Because every copy shares identical coordinates, differences between outer concepts are expressed solely through the filled nodes, making comparisons considerably easier.
Step 5: Interactive visualization
Finally, ConceptFlow exports the nested diagram as a JSON representation, rendered using D3.js [1]. The resulting HTML page supports panning, zooming, concept inspection, and navigation between nested views, all while remaining entirely self-contained.
Hand-Drawn Version: Graph Drawing Contest Poster
The same nested line diagram also appears in a poster submitted to the 2026 Graph Drawing Contest, alongside a short introduction to FCA and nested line diagrams for readers encountering the layout for the first time. Unlike the interactive version above, which ConceptFlow lays out automatically via DimFlux, the poster’s diagram was drawn by hand, which let us tighten the layout beyond what the automatic algorithm currently produces.
The poster highlights one node and leaves the reader to work out what it implies. The solution to the question about the highlighted node is: {regional support, major key, BPM ≥ 150} ⇒ {cultural support}. In other words, every winner in the diagram that received regional support, was in a major key, and had a tempo of at least 150 BPM also received cultural support.
Since the tempo scale is ordinal, every song with BPM ≥ 150 also satisfies BPM ≥ 100. Consequently, the implication also remains valid if BPM ≥ 100 is included in the premise. However, the Duquenne–Guigues (canonical) basis represents implications using minimal premises, so the redundant attribute BPM ≥ 100 is omitted.
Limitations
The ESC winners example is intended to demonstrate how ConceptFlow and nested line diagrams can be used to explore relationships across multiple conceptual scales. The implications discussed above are exact properties of the constructed context, but they should not be interpreted as general laws of ESC voting. Several choices shape the resulting diagram:
- The voting taxonomies were constructed manually. The regional, cultural, historical, and political clusters reflect commonly discussed groupings, but they were not learned from the voting data. Different groupings could change the support attributes assigned to individual winners.
- The taxonomies overlap conceptually. Geographical proximity, cultural similarity, historical relationships, and political alignment are often closely related. Some implications may therefore reflect dependencies between the taxonomies themselves rather than a direct relationship between voting patterns and musical characteristics.
- The dataset contains winners only. Restricting the analysis to 50 winning entries keeps the diagram readable and provides a focused demonstration, but the results do not describe the full population of ESC songs or voting behaviour.
- The thresholds are modelling choices. The eight-point threshold for voting support and the BPM breakpoints at 100 and 150 determine how the original data is transformed into binary attributes. Changing these values could alter the structure of the lattice and the implications derived from it.
- Tempo values can be ambiguous. Some songs may reasonably be interpreted at half or double the reported BPM, particularly when their rhythmic structure supports more than one perceived pulse.
- The implications are descriptive rather than statistical. The Duquenne-Guigues basis captures every implication that holds in this particular formal context, but no significance testing or generalization beyond the dataset was performed.
These limitations do not reduce the value of the visualization as an exploratory tool. Instead, they emphasize an important feature of conceptual scaling: the structure of a formal context depends not only on the data, but also on the modelling decisions used to represent it.
Future Work
The ESC winners example demonstrates only a small part of what ConceptFlow can support. Several extensions are planned for future releases.
- Implication theory integrated into the visualization. The most natural next step is to make implications directly accessible from the nested line diagram. Rather than computing the Duquenne-Guigues basis separately, users will be able to select a hollow node and immediately inspect the implication responsible for it, turning the visualization into an interactive tool for knowledge discovery.
- Additional conceptual scales. While this example uses general, threshold, and dichotomic scales, ConceptFlow also provides nominal, contranominal, ordinal, and interordinal scales. Future examples will demonstrate how these can be combined to analyse richer datasets.
- Improved interactive exploration. Planned features include search and filtering, enhanced navigation, support for multiple levels of nesting, and alternative visualization modes for different exploration tasks.
- Broader applications. Although the ESC provides an intuitive case study, the workflow presented here is entirely domain-independent. Any many-valued dataset can be transformed by conceptual scaling and explored using nested line diagrams.
- Additional FCA visualizations. The infrastructure developed for nested line diagrams also provides a foundation for other interactive FCA visualizations, such as conceptual exploration interfaces, implication browsers, and publication-quality diagram generation.
Conclusion
In this post, we introduced ConceptFlow and demonstrated its nested line diagram functionality using 50 years of ESC winners. By combining voting patterns and musical characteristics into two conceptual scales, the resulting visualization makes it possible to explore their relationships while preserving the structure of each scale independently. The implications derived from the combined context further illustrate how nested line diagrams can support knowledge discovery beyond what traditional visualizations typically reveal.
If you would like to explore the example further, interact with the nested line diagram above and try identifying implications directly from the visualization. The complete source code for ConceptFlow, together with the implementation of the examples presented in this post, is available on GitHub:
https://github.com/anuragxorma/conceptflow
References
[1] Bostock, M., Ogievetsky, V., & Heer, J. (2011). D3: Data-Driven Documents. IEEE Transactions on Visualization and Computer Graphics, 17(12), 2301–2309. https://doi.org/10.1109/TVCG.2011.185
[2] Ganter, B., & Wille, R. (2024). Formal Concept Analysis: Mathematical Foundations (2nd ed.). Springer.
[3] Gatherer, D. (2006). Comparison of ESC Simulation with Actual Results Reveals Shifting Patterns of Collusive Voting Alliances. Journal of Artificial Societies and Social Simulation, 9(2), Article 1. https://www.jasss.org/9/2/1.html
[4] Madison, G., & Paulin, J. (2010). Ratings of Speed in Real Music as a Function of Both Original and Manipulated Beat Tempo. The Journal of the Acoustical Society of America, 128(5), 3032–3040. https://doi.org/10.1121/1.3493462
[5] Nöhre, M., Dürrschnabel, D., Ganter, B., & Stumme, G. (2026). DimFlux: Force-Directed Additive Line Diagrams. International Journal of Approximate Reasoning, 197, 109734. https://doi.org/10.1016/j.ijar.2026.109734
[6] Sharma, A. (2026). ConceptFlow: A Scikit-Learn-Compatible Python Library for Formal Concept Analysis. GitHub repository. https://github.com/anuragxorma/conceptflow
[7] Yair, G. (1995). “Unite Unite Europe”: The Political and Cultural Structures of Europe as Reflected in the Eurovision Song Contest. Social Networks, 17(2), 147–161. https://doi.org/10.1016/0378-8733(95)00253-K