File size: 32,945 Bytes
d16b35e
 
 
 
 
 
 
 
f2f6c26
 
 
 
 
 
 
30c92e1
f2f6c26
 
 
30c92e1
 
 
 
 
 
f2f6c26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d16b35e
 
 
 
 
a0ed0f4
d16b35e
 
 
 
8092faa
 
10f3532
 
 
8092faa
 
d16b35e
b2ca17a
eb24bd8
d16b35e
2129e5e
d16b35e
 
eb61b5d
15bdd8d
d16b35e
15bdd8d
30c92e1
 
15bdd8d
eb61b5d
 
 
 
 
d16b35e
 
 
eb61b5d
d16b35e
 
eb61b5d
d16b35e
 
 
 
 
 
 
 
 
 
eb61b5d
d16b35e
 
 
 
 
 
 
 
 
eb61b5d
d16b35e
 
 
 
eb61b5d
d16b35e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb61b5d
 
 
 
 
 
d16b35e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15bdd8d
 
 
 
 
 
 
eb61b5d
 
 
 
 
 
15bdd8d
eb61b5d
 
 
 
 
 
 
 
 
d16b35e
 
 
 
 
 
 
15bdd8d
d16b35e
 
 
eb61b5d
d16b35e
 
 
15bdd8d
d16b35e
 
 
 
 
 
 
 
 
 
15bdd8d
d16b35e
15bdd8d
 
 
 
d16b35e
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>🔮 Mapping Nieman Lab's 2025 Journalism Predictions</title>
    <script src="libs/d3.min.js"></script>
    <script src="libs/plot.umd.min.js"></script>
<style>
        body { 
            margin: 0; 
            font-family: Arial, sans-serif; 
        }
        #viz { 
            width: 100%; 
            height: 67vh; 
            position: relative;
            overflow: hidden;
        }

        @media (max-width: 768px) {
            #viz {
                height: 100vh;
            }
        }
        #popup {
            display: none;
            position: absolute;
            background: white;
            border: 1px solid #ccc;
            padding: 15px;
            border-radius: 4px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            max-width: 400px;
            z-index: 1000;
            font-size: 14px;
            line-height: 1.4;
            pointer-events: auto;
        }
        h1 {
        color: #1a1a1a;
            margin-bottom: 20px;
        }
        .intro {
            max-width: 800px;
            margin: 0 auto 40px;
            text-align: center;
            line-height: 1.6;
            color: #374151;
        }
        .popup-headline {
            font-weight: bold;
            margin-bottom: 8px;
        }
        .popup-author {
            color: #666;
            margin-bottom: 8px;
        }
        .popup-url {
            color: #0066cc;
            word-break: break-all;
        }
        #note {
            font-size: 10px;
            color: #555;
            text-align: center;
            margin-top: auto;  /* Pushes the note to the bottom */
            padding: 5px;
            background-color: #f8f8f8;
            border-top: 1px solid #ddd;
        }
    </style>
</head>
<body>
<div class="intro">
    <h1>🔮 Mapping Nieman Lab's 2025 Journalism Predictions</h1>
    <p>This interactive visualization maps over <a href="https://www.niemanlab.org/collection/predictions-2025/" target="_blank">100 predictions from Nieman Lab contributors</a> about the future of journalism in the coming year, clustered by theme using natural language processing. Click on the points to read the original article and ❤️ this Space for updates with new predictions.</p>
</div>
<div id="viz">
    <div id="popup"></div>
</div>

<div id="note">
    <p>
Content from Nieman Lab is shared under a Creative Commons license. 
Visualization code adapted from Hugging Face team's <a href="https://github.com/huggingface/text-clustering" target="_blank">Text Clustering example</a> and <a href="https://maartengr.github.io/BERTopic/index.html" target="_blank">BERTopic documentation</a>.      
    </p>
</div>
<script>
const pointsData = [{"x": 3.68623423576355, "y": 3.503188371658325, "topic": -1, "headline": "A generation of journalists moves on", "author": "Meena Thiruvengadam", "url": "https://www.niemanlab.org/2024/12/a-generation-of-journalists-moves-on/"}, {"x": 2.5248708724975586, "y": 1.2917379140853882, "topic": 4, "headline": "A new generation of knowledge management tools", "author": "Jeremy Gilbert", "url": "https://www.niemanlab.org/2024/12/a-new-generation-of-knowledge-management-tools/"}, {"x": 2.2359769344329834, "y": 3.026575803756714, "topic": -1, "headline": "A renewed appetite for print", "author": "Aimee Rinehart", "url": "https://www.niemanlab.org/2024/12/a-renewed-appetite-for-print/"}, {"x": 3.4690115451812744, "y": 2.504434823989868, "topic": -1, "headline": "Accommodating journalists is in \u2014 or you\u2019re out", "author": "Rachel S. Hunt", "url": "https://www.niemanlab.org/2024/12/accommodating-journalists-is-in-or-youre-out/"}, {"x": 2.943875551223755, "y": 1.5830992460250854, "topic": -1, "headline": "Action over analysis", "author": "Meredith Artley", "url": "https://www.niemanlab.org/2024/12/action-over-analysis/"}, {"x": 1.553125023841858, "y": -0.05639424920082092, "topic": 0, "headline": "Adaptive partnerships in the AI data marketplace", "author": "Courtney Radsch", "url": "https://www.niemanlab.org/2024/12/adaptive-partnerships-in-the-ai-data-marketplace/"}, {"x": 1.6788288354873657, "y": 0.3361310660839081, "topic": 0, "headline": "Adjusting to a tech-heavy but code-light world", "author": "Daniel Trielli", "url": "https://www.niemanlab.org/2024/12/adjusting-to-a-tech-heavy-but-code-light-world/"}, {"x": 1.7549558877944946, "y": -0.4731222689151764, "topic": 0, "headline": "AI adoption matures in small and local newsrooms", "author": "Ernest Kung", "url": "https://www.niemanlab.org/2024/12/ai-adoption-matures-in-small-and-local-newsrooms/"}, {"x": 1.4280866384506226, "y": -0.256629079580307, "topic": 0, "headline": "AI companies grapple with what it means to be creators of news", "author": "Maggie Harrison Dupr\u00e9", "url": "https://www.niemanlab.org/2024/12/ai-companies-grapple-with-what-it-means-to-be-creators-of-news/"}, {"x": 4.64277458190918, "y": 2.385575771331787, "topic": -1, "headline": "AI inspires innovation in journalism education", "author": "Cindy Royal", "url": "https://www.niemanlab.org/2024/12/ai-inspires-innovation-in-journalism-education/"}, {"x": 1.8387401103973389, "y": -0.31161072850227356, "topic": 0, "headline": "AI revolutionizes access to multilingual content", "author": "Benjamin Morales Mel\u00e9ndez", "url": "https://www.niemanlab.org/2024/12/ai-revolutionizes-access-to-multilingual-content/"}, {"x": 2.434694766998291, "y": -0.23848223686218262, "topic": 0, "headline": "AI turns news into a conversation", "author": "Nikita Roy", "url": "https://www.niemanlab.org/2024/12/ai-turns-news-into-a-conversation/"}, {"x": 3.4006199836730957, "y": 4.778074741363525, "topic": 1, "headline": "All eyes are on Brazil", "author": "Natalia Viana", "url": "https://www.niemanlab.org/2024/12/all-eyes-are-on-brazil/"}, {"x": 2.7846906185150146, "y": 4.419948577880859, "topic": 1, "headline": "An authoritarian anti-journalism playbook", "author": "Benjamin Toff", "url": "https://www.niemanlab.org/2024/12/an-authoritarian-anti-journalism-playbook/"}, {"x": 1.5648119449615479, "y": -0.04692254215478897, "topic": 0, "headline": "Antitrust and AI news converge and get local", "author": "Karina Montoya", "url": "https://www.niemanlab.org/2024/12/antitrust-and-ai-news-converge-and-get-local/"}, {"x": 1.456211805343628, "y": 0.8497368097305298, "topic": 4, "headline": "B2B media shifts from content to solutions", "author": "Jay Lauf", "url": "https://www.niemanlab.org/2024/12/b2b-media-shifts-from-content-to-solutions/"}, {"x": 1.215250015258789, "y": 3.247711181640625, "topic": 2, "headline": "Back to the bundle", "author": "Ben Smith", "url": "https://www.niemanlab.org/2024/12/back-to-the-bundle/"}, {"x": 2.7915902137756348, "y": 4.060944080352783, "topic": 1, "headline": "Blocking out the audience\u2019s siren song", "author": "Jonas Kaiser", "url": "https://www.niemanlab.org/2024/12/blocking-out-the-audiences-siren-song/"}, {"x": 2.0779271125793457, "y": 0.7353351712226868, "topic": -1, "headline": "Bluesky is just the beginning", "author": "Ethan Toven-Lindsey", "url": "https://www.niemanlab.org/2024/12/bluesky-is-just-the-beginning/"}, {"x": 3.58499813079834, "y": 2.7517635822296143, "topic": -1, "headline": "Breaking old habits", "author": "Andrea Faye Hart", "url": "https://www.niemanlab.org/2024/12/breaking-old-habits/"}, {"x": 2.3669445514678955, "y": 2.6298158168792725, "topic": 5, "headline": "Communities relearn the habits of local news", "author": "Sam Mintz", "url": "https://www.niemanlab.org/2024/12/communities-relearn-the-habits-of-local-news/"}, {"x": 3.167238712310791, "y": 3.756078004837036, "topic": -1, "headline": "Conflict of interest norms will shift", "author": "Kaitlin C. Miller", "url": "https://www.niemanlab.org/2024/12/conflict-of-interest-norms-will-shift/"}, {"x": 3.098395586013794, "y": 5.109126567840576, "topic": 1, "headline": "Covering Trump 2.0, now with less Trump", "author": "Joshua P. Darr", "url": "https://www.niemanlab.org/2024/12/covering-trump-2-0-now-with-less-trump/"}, {"x": 1.4042561054229736, "y": 0.4858998954296112, "topic": -1, "headline": "Data and context makes a comeback", "author": "Robin Kwong", "url": "https://www.niemanlab.org/2024/12/data-and-context-makes-a-comeback/"}, {"x": 1.3287885189056396, "y": 0.2977237403392792, "topic": 0, "headline": "Declaring platform independence", "author": "Jason Koebler", "url": "https://www.niemanlab.org/2024/12/declaring-platform-independence/"}, {"x": 2.140462636947632, "y": -0.6642709970474243, "topic": 0, "headline": "Divergent paths for journalism\u2019s future with AI", "author": "Alfred Hermida", "url": "https://www.niemanlab.org/2024/12/divergent-paths-for-journalisms-future-with-ai/"}, {"x": 2.787271022796631, "y": 2.1186702251434326, "topic": 4, "headline": "Embrace the barbell", "author": "Millie Tran", "url": "https://www.niemanlab.org/2024/12/embrace-the-barbell/"}, {"x": 4.012465953826904, "y": 2.8803584575653076, "topic": -1, "headline": "Embracing influencers as allies", "author": "Marlon A. Walker", "url": "https://www.niemanlab.org/2024/12/embracing-influencers-as-allies/"}, {"x": 2.7748429775238037, "y": 4.814492225646973, "topic": 1, "headline": "Focus on the people who elect populists", "author": "Francesco Zaffarano", "url": "https://www.niemanlab.org/2024/12/focus-on-the-people-who-elect-populists/"}, {"x": 2.019266128540039, "y": -0.18187880516052246, "topic": 0, "headline": "Get ready for the AI-driven world of news", "author": "Gina Chua", "url": "https://www.niemanlab.org/2024/12/get-ready-for-the-ai-driven-world-of-news/"}, {"x": 2.636654853820801, "y": 3.4752390384674072, "topic": -1, "headline": "How do we cover \u201cpeople like me\u201d?", "author": "Tania L. Montalvo", "url": "https://www.niemanlab.org/2024/12/how-do-we-cover-people-like-me/"}, {"x": 4.299729824066162, "y": 3.125300645828247, "topic": 3, "headline": "Humanness > authenticity", "author": "Val\u00e9rie B\u00e9lair-Gagnon", "url": "https://www.niemanlab.org/2024/12/humanness-authenticity/"}, {"x": 1.9293971061706543, "y": 2.124225616455078, "topic": -1, "headline": "Impact investment enters the chat", "author": "Adam Thomas", "url": "https://www.niemanlab.org/2024/12/impact-investment-enters-the-chat/"}, {"x": 1.6781424283981323, "y": 3.889058828353882, "topic": 2, "headline": "Influencers become journalists", "author": "Jessica Maddox", "url": "https://www.niemanlab.org/2024/12/influencers-become-journalists/"}, {"x": 3.156911849975586, "y": 2.864645481109619, "topic": -1, "headline": "Investing in the disability beat", "author": "James Salanga", "url": "https://www.niemanlab.org/2024/12/investing-in-the-disability-beat/"}, {"x": 3.118644952774048, "y": 2.9437448978424072, "topic": 5, "headline": "Journalism as a social service", "author": "Simon Galperin", "url": "https://www.niemanlab.org/2024/12/journalism-as-a-social-service/"}, {"x": 4.755356788635254, "y": 2.677163600921631, "topic": 3, "headline": "Journalism education leads the change we seek", "author": "Mira Lowe", "url": "https://www.niemanlab.org/2024/12/journalism-education-leads-the-change-we-seek/"}, {"x": 4.718067169189453, "y": 2.6366186141967773, "topic": 3, "headline": "Journalism educators unite", "author": "Amy Schmitz Weiss", "url": "https://www.niemanlab.org/2024/12/journalism-educators-unite/"}, {"x": 3.540827512741089, "y": 4.539740562438965, "topic": 1, "headline": "Journalism faces a reckoning, in Soviet style", "author": "Izabella Kaminska", "url": "https://www.niemanlab.org/2024/12/journalism-faces-a-reckoning-in-soviet-style/"}, {"x": 1.8075262308120728, "y": 3.551682949066162, "topic": 2, "headline": "Journalism has its Kendrick Lamar year", "author": "Delano Massey", "url": "https://www.niemanlab.org/2024/12/journalism-has-its-kendrick-lamar-year/"}, {"x": 3.5100533962249756, "y": 4.226345539093018, "topic": -1, "headline": "Double down on journalistic independence", "author": "Amy Mitchell", "url": "https://www.niemanlab.org/2024/12/journalism-today-is-a-process-that-starts-with-journalistic-independence/"}, {"x": 1.396511435508728, "y": -0.5310359597206116, "topic": 0, "headline": "Journalists build the AI tools they actually want to use", "author": "Retha Hill", "url": "https://www.niemanlab.org/2024/12/journalists-build-the-ai-tools-they-actually-want-to-use/"}, {"x": 2.7958152294158936, "y": 3.8353874683380127, "topic": -1, "headline": "Journalists embrace transparency about the business side", "author": "Jacob L. Nelson", "url": "https://www.niemanlab.org/2024/12/journalists-embrace-transparency-about-the-business-side/"}, {"x": 3.1253905296325684, "y": 4.6627678871154785, "topic": 1, "headline": "Journalists explain legislative procedure", "author": "Nik Usher", "url": "https://www.niemanlab.org/2024/12/journalists-explain-legislative-procedure/"}, {"x": 4.096528053283691, "y": 3.306628465652466, "topic": 3, "headline": "Journalists fight digital decay", "author": "Basile Simon", "url": "https://www.niemanlab.org/2024/12/journalists-fight-digital-decay/"}, {"x": 2.3905889987945557, "y": 2.7802317142486572, "topic": 5, "headline": "Lessons learned in The Building of Lost Causes", "author": "Linda Solomon Wood", "url": "https://www.niemanlab.org/2024/12/lessons-learned-in-the-building-of-lost-causes/"}, {"x": 1.42769455909729, "y": 3.3844382762908936, "topic": 2, "headline": "Local collaboration follows contraction", "author": "Larry Ryckman", "url": "https://www.niemanlab.org/2024/12/local-collaboration-follows-contraction/"}, {"x": 1.4550848007202148, "y": 3.141420364379883, "topic": 2, "headline": "Local media gets its swagger back", "author": "Fran Wills", "url": "https://www.niemanlab.org/2024/12/local-media-gets-its-swagger-back/"}, {"x": 2.426140308380127, "y": 3.717825174331665, "topic": 1, "headline": "Maybe we really are done with news?", "author": "Matt Carlson", "url": "https://www.niemanlab.org/2024/12/maybe-we-really-are-done-with-news/"}, {"x": 1.4029443264007568, "y": 0.5376128554344177, "topic": 0, "headline": "Media companies will love their websites a lot less", "author": "Jonathan Hunt", "url": "https://www.niemanlab.org/2024/12/media-companies-will-love-their-websites-a-lot-less/"}, {"x": 2.7796266078948975, "y": 5.190230369567871, "topic": 1, "headline": "Media\u2019s acquiescence to Trump will fail", "author": "Noah Shachtman", "url": "https://www.niemanlab.org/2024/12/medias-acquiescence-to-trump-will-fail/"}, {"x": 4.727552890777588, "y": 2.8071556091308594, "topic": 3, "headline": "More newsrooms will partner with student journalists", "author": "Sumi Aggarwal", "url": "https://www.niemanlab.org/2024/12/more-newsrooms-will-partner-with-student-journalists/"}, {"x": 2.180946111679077, "y": 0.26114919781684875, "topic": 0, "headline": "New dimensions for news storytelling", "author": "Kawandeep Virdee", "url": "https://www.niemanlab.org/2024/12/new-dimensions-for-news-storytelling/"}, {"x": 2.2870888710021973, "y": 1.385071039199829, "topic": 4, "headline": "News jumps off the page", "author": "Annemarie Dooling", "url": "https://www.niemanlab.org/2024/12/news-jumps-off-the-page/"}, {"x": 1.2396306991577148, "y": 0.2084752768278122, "topic": -1, "headline": "News websites hit an evolutionary dead end", "author": "Simon Allison", "url": "https://www.niemanlab.org/2024/12/news-websites-hit-an-evolutionary-dead-end/"}, {"x": 2.3563215732574463, "y": 1.3111847639083862, "topic": 4, "headline": "Newsroom planning goes silo-free", "author": "Kendall Trammell", "url": "https://www.niemanlab.org/2024/12/newsroom-planning-goes-silo-free/"}, {"x": 1.98489248752594, "y": 1.9534194469451904, "topic": 4, "headline": "Newsrooms break new ground in AI", "author": "Chase Davis", "url": "https://www.niemanlab.org/2024/12/newsrooms-break-new-ground-in-ai/"}, {"x": 3.4913430213928223, "y": 4.386300563812256, "topic": 1, "headline": "Newsrooms fight back against criminalization", "author": "Jos\u00e9 Zamora", "url": "https://www.niemanlab.org/2024/12/newsrooms-fight-back-against-criminalization/"}, {"x": 3.387619972229004, "y": 4.120192050933838, "topic": 1, "headline": "Newsrooms reinvent their political journalism", "author": "Alexandra Borchardt", "url": "https://www.niemanlab.org/2024/12/newsrooms-reinvent-their-political-journalism/"}, {"x": 2.950793981552124, "y": 4.15198278427124, "topic": 1, "headline": "Newsrooms will keep losing their conservative audiences", "author": "Jonathan Stray", "url": "https://www.niemanlab.org/2024/12/newsrooms-will-keep-losing-their-conservative-audiences/"}, {"x": 3.2595901489257812, "y": 2.316451072692871, "topic": 5, "headline": "No more baby steps in fixing crime coverage", "author": "Cassie Owens", "url": "https://www.niemanlab.org/2024/12/no-more-baby-steps-in-fixing-crime-coverage/"}, {"x": 1.8516250848770142, "y": 2.968437910079956, "topic": -1, "headline": "Outlets pivot to promoting action, not just news", "author": "Anita Li", "url": "https://www.niemanlab.org/2024/12/outlets-pivot-to-promoting-action-not-just-news/"}, {"x": 2.5268280506134033, "y": -0.34073981642723083, "topic": 0, "headline": "Play with AI like your career depends on it (it does)", "author": "Marie Gilot", "url": "https://www.niemanlab.org/2024/12/play-with-ai-like-your-career-depends-on-it-it-does/"}, {"x": 1.386070728302002, "y": 3.6753852367401123, "topic": 2, "headline": "Podcasting becomes the primary strategy, not an afterthought", "author": "Joni Deutsch", "url": "https://www.niemanlab.org/2024/12/podcasting-becomes-the-primary-strategy-not-an-afterthought/"}, {"x": 2.807302713394165, "y": 1.886401653289795, "topic": -1, "headline": "Prediction markets go mainstream", "author": "Taylor Lorenz", "url": "https://www.niemanlab.org/2024/12/prediction-markets-go-mainstream/"}, {"x": 3.0588486194610596, "y": 3.5520148277282715, "topic": -1, "headline": "Prepare for the unthinkable", "author": "Jennifer Brandel", "url": "https://www.niemanlab.org/2024/12/prepare-for-the-unthinkable/"}, {"x": 1.5960733890533447, "y": 3.5221080780029297, "topic": 2, "headline": "Progressive media at a crossroads", "author": "Anthony Nadler", "url": "https://www.niemanlab.org/2024/12/progressive-media-at-a-crossroads/"}, {"x": 1.436760425567627, "y": 3.3063714504241943, "topic": 2, "headline": "Public media embraces its future", "author": "Kerri Hoffman", "url": "https://www.niemanlab.org/2024/12/public-media-embraces-its-future/"}, {"x": 1.7326470613479614, "y": 3.4025256633758545, "topic": 2, "headline": "Public media reconciles its past with the present", "author": "Kristen Muller", "url": "https://www.niemanlab.org/2024/12/public-media-reconciles-its-past-with-the-present/"}, {"x": 1.7326139211654663, "y": -0.10127607733011246, "topic": 0, "headline": "Publishers find the AI era not all that lucrative", "author": "Rasmus Kleis Nielsen", "url": "https://www.niemanlab.org/2024/12/publishers-find-the-ai-era-not-all-that-lucrative/"}, {"x": 2.8028368949890137, "y": 3.171997547149658, "topic": -1, "headline": "Publishers reckon with dark patterns", "author": "Jasmine McNealy", "url": "https://www.niemanlab.org/2024/12/publishers-reckon-with-dark-patterns/"}, {"x": 1.5251433849334717, "y": -0.6197857856750488, "topic": 0, "headline": "Put AI at the beginning, not at the end", "author": "Ole Rei\u00dfmann", "url": "https://www.niemanlab.org/2024/12/put-ai-at-the-beginning-not-at-the-end/"}, {"x": 2.273069143295288, "y": 1.6632107496261597, "topic": -1, "headline": "Readers will seek out well-moderated spaces", "author": "Scott Lamb", "url": "https://www.niemanlab.org/2024/12/readers-will-seek-out-well-moderated-spaces/"}, {"x": 3.0081465244293213, "y": 5.2444586753845215, "topic": 1, "headline": "Religious-sounding language will be everywhere in 2025", "author": "Whitney Phillips", "url": "https://www.niemanlab.org/2024/12/religious-sounding-language-will-be-everywhere-in-2025/"}, {"x": 3.1310536861419678, "y": 3.347532272338867, "topic": -1, "headline": "Science journalism becomes plain old journalism", "author": "Siri Carpenter", "url": "https://www.niemanlab.org/2024/12/science-journalism-becomes-plain-old-journalism/"}, {"x": 1.680755853652954, "y": 3.8936710357666016, "topic": 2, "headline": "Sports journalists break away from access-based journalism", "author": "Brian Moritz", "url": "https://www.niemanlab.org/2024/12/sports-journalists-break-away-from-access-based-journalism/"}, {"x": 2.245842695236206, "y": 2.210665225982666, "topic": 5, "headline": "Story budgets get reshaped to coax the disengaged", "author": "Jody Brannon", "url": "https://www.niemanlab.org/2024/12/story-budgets-get-reshaped-to-coax-the-disengaged/"}, {"x": 1.4994430541992188, "y": 1.1744489669799805, "topic": -1, "headline": "Taking lessons from independent bookstores", "author": "Eric Nuzum", "url": "https://www.niemanlab.org/2024/12/taking-lessons-from-independent-bookstores/"}, {"x": 4.363303184509277, "y": 3.0654985904693604, "topic": 3, "headline": "The darkness that democracy dies in is here", "author": "Carrie Brown", "url": "https://www.niemanlab.org/2024/12/the-darkness-that-democracy-dies-in-is-here/"}, {"x": 2.2038419246673584, "y": -0.7512913942337036, "topic": 0, "headline": "The distinct human writer becomes more essential", "author": "Mario Garc\u00eda", "url": "https://www.niemanlab.org/2024/12/the-distinct-human-writer-becomes-more-essential/"}, {"x": 2.6224491596221924, "y": 4.872861862182617, "topic": 1, "headline": "The federal attack on the press will trickle down locally", "author": "Katie Honan", "url": "https://www.niemanlab.org/2024/12/the-federal-attack-on-the-press-will-trickle-down-locally/"}, {"x": 4.303241729736328, "y": 3.457742214202881, "topic": 3, "headline": "The line between activism and journalism breaks", "author": "Hafsa Maqsood", "url": "https://www.niemanlab.org/2024/12/the-line-between-activism-and-journalism-breaks/"}, {"x": 3.0008506774902344, "y": 1.447888731956482, "topic": -1, "headline": "The longform renaissance", "author": "Geetika Rudra", "url": "https://www.niemanlab.org/2024/12/the-longform-renaissance/"}, {"x": 3.115023612976074, "y": 4.634903430938721, "topic": 1, "headline": "The media becomes an activist for democracy", "author": "Gideon Lichfield", "url": "https://www.niemanlab.org/2024/12/the-media-becomes-an-activist-for-democracy/"}, {"x": 4.137185096740723, "y": 3.8704967498779297, "topic": -1, "headline": "The media industry adopts an insurgent strategy", "author": "Saba Long", "url": "https://www.niemanlab.org/2024/12/the-media-industry-adopts-an-insurgent-strategy/"}, {"x": 2.7421724796295166, "y": 4.994019985198975, "topic": 1, "headline": "The media surrenders to Trump 2.0", "author": "Parker Molloy", "url": "https://www.niemanlab.org/2024/12/the-media-surrenders-to-trump-2-0/"}, {"x": 3.643988609313965, "y": 2.703531503677368, "topic": -1, "headline": "The moral injury epidemic", "author": "Andrew Losowsky", "url": "https://www.niemanlab.org/2024/12/the-moral-injury-epidemic/"}, {"x": 2.9918904304504395, "y": 4.674120903015137, "topic": 1, "headline": "The New York Times will hire a pro-Trump columnist", "author": "Matthew Pressman", "url": "https://www.niemanlab.org/2024/12/the-new-york-times-will-hire-a-pro-trump-columnist/"}, {"x": 0.9608303308486938, "y": 2.784249782562256, "topic": 2, "headline": "The podcast middle class will continue to shrink", "author": "Alex Sujong Laughlin", "url": "https://www.niemanlab.org/2024/12/the-podcast-middle-class-will-continue-to-shrink/"}, {"x": 1.3357559442520142, "y": 3.012587785720825, "topic": 2, "headline": "The print revival comes to news", "author": "Esther Kezia Thorpe", "url": "https://www.niemanlab.org/2024/12/the-print-revival-comes-to-news/"}, {"x": 2.55924391746521, "y": 4.155697822570801, "topic": -1, "headline": "The publisher is always right", "author": "Gabe Schneider", "url": "https://www.niemanlab.org/2024/12/the-publisher-is-always-right/"}, {"x": 2.063018798828125, "y": 3.1209709644317627, "topic": -1, "headline": "The rebirth of local news", "author": "Sarabeth Berman", "url": "https://www.niemanlab.org/2024/12/the-rebirth-of-local-news/"}, {"x": 2.4869766235351562, "y": 3.180321455001831, "topic": 5, "headline": "The rise of informal news networks", "author": "Heather Chaplin", "url": "https://www.niemanlab.org/2024/12/the-rise-of-informal-news-networks/"}, {"x": 1.9863874912261963, "y": 1.1947556734085083, "topic": 4, "headline": "The year newsrooms tackle their structural issues", "author": "Nick Petrie", "url": "https://www.niemanlab.org/2024/12/the-year-newsrooms-tackle-their-structural-issues/"}, {"x": 1.4401533603668213, "y": -0.35003459453582764, "topic": 0, "headline": "The year we stop talking about \u201cAI\u201d", "author": "Burt Herman", "url": "https://www.niemanlab.org/2024/12/the-year-we-stop-talking-about-ai/"}, {"x": 2.9596524238586426, "y": 5.210065841674805, "topic": 1, "headline": "There\u2019s no \u201cTrump Bump\u201d (and that\u2019s good!)", "author": "Hillary Frey", "url": "https://www.niemanlab.org/2024/12/theres-no-trump-bump-and-thats-good/"}, {"x": 1.409725546836853, "y": 2.7081401348114014, "topic": 2, "headline": "To hell with algorithms", "author": "Rodney Gibbs", "url": "https://www.niemanlab.org/2024/12/to-hell-with-algorithms/"}, {"x": 2.030881404876709, "y": -0.2576357424259186, "topic": 0, "headline": "Using AI to make news more accessible", "author": "Chitranshu Tewari", "url": "https://www.niemanlab.org/2024/12/using-ai-to-make-news-more-accessible/"}, {"x": 3.439234972000122, "y": 3.2868292331695557, "topic": 1, "headline": "Watch your language", "author": "Doris Truong", "url": "https://www.niemanlab.org/2024/12/watch-your-language/"}, {"x": 2.8281993865966797, "y": 1.8477591276168823, "topic": 4, "headline": "We can\u2019t predict the future \u2014 but it\u2019s essential to plan for it", "author": "AX Mina", "url": "https://www.niemanlab.org/2024/12/we-cant-predict-the-future-but-its-essential-to-plan-for-it/"}, {"x": 2.3857457637786865, "y": -0.2101096212863922, "topic": 0, "headline": "We stop excusing the lack of accessibility in news", "author": "Joe Amditis", "url": "https://www.niemanlab.org/2024/12/we-stop-excusing-the-lack-of-accessibility-in-news/"}, {"x": 4.247597694396973, "y": 3.5565571784973145, "topic": 3, "headline": "We\u2019ll reach beyond our own lane", "author": "Sharon Moshavi", "url": "https://www.niemanlab.org/2024/12/well-reach-beyond-our-own-lane/"}, {"x": 2.5994222164154053, "y": 2.901196241378784, "topic": 5, "headline": "We\u2019ll rethink scale, trust, and our life\u2019s work", "author": "S. Mitra Kalita", "url": "https://www.niemanlab.org/2024/12/well-rethink-scale-trust-and-our-lifes-work/"}, {"x": 1.2203879356384277, "y": 0.7107078433036804, "topic": 0, "headline": "You\u2019ll need to care more about your value chain", "author": "Sam Guzik", "url": "https://www.niemanlab.org/2024/12/youll-need-to-care-more-about-your-value-chain/"}, {"x": 4.716219425201416, "y": 2.962329864501953, "topic": 3, "headline": "Young journalists will reimagine a better press", "author": "Christoph Mergerson", "url": "https://www.niemanlab.org/2024/12/young-journalists-will-reimagine-a-better-press/"}, {"x": 1.902227759361267, "y": 2.5794620513916016, "topic": -1, "headline": "Your Audience team is now your Creator team", "author": "Ryan Kellett", "url": "https://www.niemanlab.org/2024/12/your-audience-team-is-now-your-creator-team/"}];
const labelData = [{"x": 1.7994170188903809, "y": -0.15466168522834778, "label": " AI, news organizations, adoption", "topic": 0}, {"x": 3.0226552486419678, "y": 4.572046756744385, "label": " Politics, Trump Administration", "topic": 1}, {"x": 1.4709473848342896, "y": 3.347642421722412, "label": " Publishing industry, fragmentation", "topic": 2}, {"x": 4.269733238220215, "y": 3.066110372543335, "label": " Education, authenticity, frustration", "topic": 3}, {"x": 2.2764053344726562, "y": 1.494041919708252, "label": " Digital news transformation", "topic": 4}, {"x": 2.63828706741333, "y": 2.7089178562164307, "label": " Local news decline, trust, crisis", "topic": 5}];

// Create visualization function
function createVisualization() {
    const container = d3.select("#viz");
    
    // Set dynamic width and height for responsiveness
    const width = window.innerWidth;
    const isMobile = width < 768;
    const height = isMobile ? window.innerHeight : window.innerHeight * 0.67;    
    
    
    // Adjust sizes based on device
    const pointSize = isMobile ? 8 : 12;
    const labelSize = isMobile ? 12 : 16;
    const labelPadding = isMobile ? 4 : 8;
    
    const plot = Plot.plot({
        width: width,
        height: height,
        margin: isMobile ? 30 : 50,
        style: {
            background: "white",
            fontSize: isMobile ? 10 : 12,
            overflow: "visible"
        },
        color: {
            scheme: "tableau10"
        },
        marks: [
            Plot.dot(pointsData, {
                x: "x",
                y: "y",
                fill: d => `topic${d.topic}`,
                r: pointSize,
                opacity: 0.6,
                stroke: "white",
                strokeWidth: 0.5
            }),
            Plot.text(labelData, {
                x: "x",
                y: "y",
                text: "label",
                fill: "black",
                fontSize: labelSize,
                fontWeight: "bold",
                dx: 0,
                dy: 0,
                background: true,
                backgroundPadding: labelPadding,
                backgroundFill: "white",
                backgroundOpacity: 0.9
            })
        ],
        x: {
            axis: null
        },
        y: {
            axis: null
        }
    });

    container.node().appendChild(plot);
    
    const popup = d3.select("#popup");
    
    // Adjust popup styling for mobile
    if (isMobile) {
        popup.style("max-width", "280px")
            .style("font-size", "12px");
    }
    
    // Function to update popup content and position
    function updatePopup(circle) {
        const index = Array.from(document.querySelectorAll('circle')).indexOf(circle);
        const point = pointsData[index];
        const topic = point.topic;
        const topicLabel = labelData.find(l => l.topic === topic)?.label || 'Unknown Topic';
        
        popup
            .style("display", "block")
            .html(`
                <div class="popup-headline">${point.headline}</div>
                <div class="popup-author">By ${point.author || 'Unknown Author'}</div>
                <div class="popup-url">${point.url}</div>
                <div style="margin-top: 8px"><strong>Topic:</strong> ${topicLabel}</div>
            `);
        
        const rect = circle.getBoundingClientRect();
        const vizRect = document.getElementById("viz").getBoundingClientRect();
        const popupRect = popup.node().getBoundingClientRect();
        const windowWidth = window.innerWidth;
        const windowHeight = window.innerHeight;

        // Calculate initial position
        let leftPos = rect.left - vizRect.left + rect.width/2;
        let topPos = rect.top - vizRect.top - popupRect.height - 10;

        // Adjust popup position for mobile
        if (isMobile) {
            // Center popup horizontally on mobile
            leftPos = (windowWidth - popupRect.width) / 2;
            // Position popup at fixed distance from top
            topPos = 20;
        } else {
            // Desktop positioning logic
            if (rect.left + popupRect.width > windowWidth) {
                leftPos = windowWidth - popupRect.width - 20;
            }
            if (leftPos < 0) {
                leftPos = 20;
            }
            if (topPos < 0) {
                topPos = rect.top - vizRect.top + rect.height + 10;
            }
        }

        popup
            .style("left", leftPos + "px")
            .style("top", topPos + "px");
    }

    // Handle clicks on points
    d3.selectAll("circle")
        .style("cursor", "pointer")
        .on("click", function(event) {
            event.stopPropagation();
            updatePopup(this);
        });

    // Click anywhere else to close popup
    document.addEventListener("click", function() {
        popup.style("display", "none");
    });

    // Prevent popup from closing when clicking inside it
    popup.node().addEventListener("click", function(event) {
        event.stopPropagation();
    });
}

// Wait for everything to be loaded and on window resize to adjust
window.addEventListener('load', createVisualization);
window.addEventListener('resize', function() {
    d3.select("#viz").html('');
    createVisualization();
});
</script>
</body>
</html>