<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Fritz Lekschas — Blog</title>
    <link>https://lekschas.de/blog</link>
    <atom:link href="https://lekschas.de/blog/rss.xml" rel="self" type="application/rss+xml" />
    <description>Notes on making complex data explorable. Mostly the tools and the thinking behind them, sometimes a paper or a conference, occasionally news.</description>
    <language>en</language>
    <lastBuildDate>Fri, 07 Aug 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>Announcing Ridge AI's Build Agent 2</title>
      <link>https://lekschas.de/blog/today-were-announcing-build-agent-2-our-biggest</link>
      <guid isPermaLink="true">https://lekschas.de/blog/today-were-announcing-build-agent-2-our-biggest</guid>
      <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
      <description>Since our beta started, Ridge AI's Build Agent has turned datasets into interactive dashboards. Feedback from customers and many rounds of evals showed us where it fell short of our vision, so we r…</description>
      <content:encoded><![CDATA[<p>Today we’re announcing Build Agent 2, our biggest step yet toward an analyst that helps you identify the right questions and build an effective analysis around them: <a href="https://www.ridgedata.ai/blog/build-agent-2" rel="nofollow">https://www.ridgedata.ai/blog/build-agent-2</a></p> <p>Since our beta started, <a href="https://www.ridgedata.ai" rel="nofollow">Ridge AI</a>’s Build Agent has turned datasets into interactive dashboards. Feedback from customers and many rounds of evals showed us where it fell short of our vision, so we re-engineered it from the ground up.</p> <p>The hard part is knowing how much to ask before building. Too many questions and it’s a chore, too few and you get a plausible dashboard answering the wrong question. Arrive with a clear brief and the new agent gets straight to work. Start with only a broad goal and it asks focused questions grounded in your data, offering useful directions when you’re not yet sure what matters. Either way, it summarizes its understanding for you to confirm. It can also draw on documents you’ve already written, like metric definitions or business rules, instead of asking you to repeat them.</p> <p>Once the goal is clear, the agent works in stages: first understand the data and what you’re after, then define the metrics and filters that answer it, and only then design the charts. It turns the confirmed goal into a plan and keeps every requested part in view as it builds. If something needs to be adapted or isn’t supported, it tells you what changed. What each stage learns carries into the next one and into later refinements, so the dashboard stays connected to its original purpose.</p> <p>Visual analysis is rarely a straight line, of course. The agent can reconsider choices as the dashboard takes shape, and explicit undo and redo let you back up and try another direction. You can also rearrange the dashboard directly and continue working with the agent from there.</p> <p>Build Agent 2 is live for all beta customers, including existing dashboards. Nothing to migrate or turn on. We have a few more exciting updates going live in the coming days and weeks as we prepare for general availability.</p> <p>Happy building! 📊 And ping <a href="https://www.linkedin.com/in/elliefields/" rel="nofollow">Ellie</a>, <a href="https://www.linkedin.com/in/jeffreyheer/" rel="nofollow">Jeff</a>, <a href="https://www.linkedin.com/in/andy-caley-6214b331/" rel="nofollow">Andy</a>, <a href="https://www.linkedin.com/in/eliasmahfoud/" rel="nofollow">Elias</a>, or <a href="https://www.linkedin.com/in/flekschas" rel="nofollow">me</a> if you have thoughts, want beta access, or just want to chat about a cool dashboard of yours.</p>]]></content:encoded>
    </item>
    <item>
      <title>Say 👋 to dtour: a visualization tool for smoothly navigating through high-dimensional data</title>
      <link>https://lekschas.de/blog/high-dimensional-data-is-hard-to-understand</link>
      <guid isPermaLink="true">https://lekschas.de/blog/high-dimensional-data-is-hard-to-understand</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <description>To help you develop better intuition for high-dimensional datasets, Nezar Abdennur and I built dtour, a visualization tool for smoothly navigating through data projections.</description>
      <content:encoded><![CDATA[<p>High-dimensional data is hard to understand. But is it truly cursed?</p> <p>To help you develop better intuition for high-dimensional datasets, <a href="https://nvictus.me" rel="nofollow">Nezar Abdennur</a> and I built dtour, a visualization tool for smoothly navigating through data projections.</p> <p>→ <a href="https://github.com/flekschas/dtour" rel="nofollow">https://github.com/flekschas/dtour</a></p> <p>Some dimensionality reduction methods find interesting angles but hide everything orthogonal to them. Other methods compress the whole manifold into 2D, which can muddle genuine structure with layout artifacts.</p> <p>Traversing multiple projections can help build a more holistic understanding of high-dim manifolds, and dtour makes such exploration effortless through one interface: you can switch fluidly between an overview gallery of projection “keyframes”, a guided cyclical tour along geodesic paths connecting keyframes, fine manual axis manipulation for user-driven excursions, and a wandering grand tour for serendipitous discovery.</p> <p>dtour is built around two types of workflows:</p> <ol><li>revealing structure in a single high-dimensional space through hyperdimensional tours, and</li> <li>validating or comparing embeddings through sequential tours over a series of 2D projections.</li></ol> <p>For examples:</p> <p><a href="https://dkobak.github.io/" rel="nofollow">Dmitri Kobak</a> and colleagues have shown that non-linear neighbor-embedding methods all lie on a spectrum that weighs attractive forces between neighbors against repulsive forces between all points. Smoothly scrubbing along that spectrum on Fashion MNIST makes it tangible which clusters in a UMAP-like layout are genuine signal and which only emerge under strong repulsion. You can also tour through the structure of a single high-dimensional dataset along its own spectral basis. For instance, on a 346K-cell single-cell surface-protein dataset from Florian Mair, a Laplacian Eigenmaps tour recovers known immunological hierarchy and gradually reveals cell phenotypes.</p> <p>On the validation side, we used dtour to inspect a 2D UMAP using a 8D PCA tour of a 276K-cell developing mouse brain from La Manno et al. showing which clusters are visible in the linear basis and which are exaggerated by the non-linear embedding. You can also use dtour to compare different embedding methods. For instance, a sequential tour through four embeddings of 3 million arXiv title+abstracts under SPECTER2, BGE-M3, Nomic Embed v2, and F2LLM-v2 8B surfaces where modern sentence embedding models agree on similarity and where they don’t.</p> <p>Explore these yourself: <a href="https://dtour.dev" rel="nofollow">https://dtour.dev</a></p> <p>dtour is optimized for performance: it runs smoothly for up to ~10M points and remains usable up to ~20M. To get there, we use WebGPU/GL, Web Workers, and OffscreenCanvas.</p> <p>dtour runs in any modern browser, ships as a Jupyter/Marimo widget for notebook workflows, and embeds in React apps.</p> <p>Preprint on arXiv: <a href="https://arxiv.org/abs/2605.04306" rel="nofollow">https://arxiv.org/abs/2605.04306</a>.</p> <p>And if dtour proves useful in any projection of your reality, please subscribe to a wonderful rest of your day.</p>]]></content:encoded>
    </item>
    <item>
      <title>Jupyter Scatter v1.0 is out! 🥳</title>
      <link>https://lekschas.de/blog/jupyter-scatter-v1-0-is-out</link>
      <guid isPermaLink="true">https://lekschas.de/blog/jupyter-scatter-v1-0-is-out</guid>
      <pubDate>Mon, 11 May 2026 12:00:00 GMT</pubDate>
      <description>It's been a minute since the last update and quite the journey since 2020. The API has been stable for a while now, and I finally addressed the last remaining things on my list, so it felt like the…</description>
      <content:encoded><![CDATA[<p>Jupyter Scatter v1.0 is out! 🥳</p> <p>It’s been a minute since the last update and quite the journey since 2020. The API has been stable for a while now, and I finally addressed the last remaining things on my list, so it felt like the right moment to cut a v1.0.</p> <p>→ Code: <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a> → Docs: <a href="https://jupyter-scatter.dev" rel="nofollow">https://jupyter-scatter.dev</a></p> <p>Three things in particular made this version feel ready:</p> <ol><li><p>Arrow PyCapsule support. Jupyter Scatter now accepts any DataFrame that implements the Arrow PyCapsule interface (Polars, DuckDB, etc.). Thanks <a href="https://kylebarron.dev" rel="nofollow">Kyle Barron</a> for bringing this to my attention! The integration ended up being super easy thanks to the well-designed protocol.</p></li> <li><p>Full Marimo support. The toolbar UI moved from Python ipywidgets to TS+React, which means Jupyter Scatter now also fully works inside Marimo notebooks. 🎉</p></li> <li><p>Point draw ordering via <code>order()</code>. Useful when overplotting otherwise hides the points you actually want to see or when you want to move NA/noise points to the back.</p></li></ol> <p>Other goodies:</p> <ul><li>Categorical color encoding in the histogram bars</li> <li>Mostly Python 3.14 support (the one gap is label placement, since geoindex-rs doesn’t have 3.14 wheels yet)</li> <li>The usual bunch of bug fixes (mostly around categorical color encoding)</li></ul> <p>Full changelog: <a href="https://github.com/flekschas/jupyter-scatter/blob/main/CHANGELOG.md" rel="nofollow">https://github.com/flekschas/jupyter-scatter/blob/main/CHANGELOG.md</a></p> <p>Reflecting back, the most critical part of Jupyter Scatter has always been the ease of its API, and the most profound step toward that happened 5 years ago in PR #4 (<a href="https://github.com/flekschas/jupyter-scatter/pull/4" rel="nofollow">https://github.com/flekschas/jupyter-scatter/pull/4</a>). Everything since has felt like candy on top. Not a new insight, but worth saying out loud: getting the foundational interface right is what matters most.</p> <p>Huge shoutout to <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> for years of continued support, and to <a href="https://nvictus.me/" rel="nofollow">Nezar Abdennur</a> for critical feedback at the very beginning that shaped the now-stable API. 🙏</p> <p>A secondary goal was that Jupyter Scatter would be useful beyond a standalone widget. I.e., that other tools could build on top of it. I’m happy that this has worked out, e.g., in Ozette’s comparative-embedding-visualization (<a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a> - Let’s gooo Trevor Manz!) and scSketch (<a href="https://github.com/colabobio/scsketch" rel="nofollow">https://github.com/colabobio/scsketch</a> - More soon from Askar Temirbek and Andres Colubri 🎉). Hopefully others will follow.</p> <p>Jupyter Scatter also inspired a new tool that goes beyond the fundamental limitation of single 2D projection scatters… 🫣🤫</p> <p>Anyway, thanks for reading until the end! If Jupyter Scatter has been useful to you, I’m happy. Keep scatter plotting 💪</p>]]></content:encoded>
    </item>
    <item>
      <title>How does AI change the way we build visualization tools</title>
      <link>https://lekschas.de/blog/how-does-ai-change-the-way-we-build</link>
      <guid isPermaLink="true">https://lekschas.de/blog/how-does-ai-change-the-way-we-build</guid>
      <pubDate>Mon, 27 Apr 2026 12:00:00 GMT</pubDate>
      <description>I believe AI multiplies what's already there, meaning software design principles matter more than ever. That was the main takeaway from an invited guest lecture I gave last week in Qianwen Wang's v…</description>
      <content:encoded><![CDATA[<p>How does AI change the way we build visualization tools? I believe AI multiplies what’s already there, meaning software design principles matter more than ever. That was the main takeaway from an invited guest lecture I gave last week in <a href="https://qianwen.info" rel="nofollow">Qianwen Wang</a>’s visualization class at the University of Minnesota.</p> <p>Slides: <a href="https://speakerdeck.com/flekschas/data-visualization-tools-in-the-age-of-ai" rel="nofollow">https://speakerdeck.com/flekschas/data-visualization-tools-in-the-age-of-ai</a></p> <p>The goal of a visualization tool is to raise the insight rate, i.e., how quickly a user gets from data to a relational understanding. Many academic visualization tools have practical limitations that hinder adoption (think a steep learning curve or missing practical features), which results in a real-world insight rate that’s not significantly above common plotting tools. So how does AI change this picture?</p> <p>It depends on what you start from. Applying AI to a closed, monolithic tool only goes so far. You might get a friendlier onboarding step or a chat sidebar but that’s it. Applying AI to a tool that’s already integrated, composable, scalable, and programmable yields compounding benefits: shorter learning curves (AI helps explain and use your tool if it’s programmable), almost no tool switching cost (AI can compose and integrate tools through MCP etc.), and a higher insight ceiling (AI can help surface and explain analysis or data collection artifacts not shown in the vis tool).</p> <p>Hence, AI multiplies what’s already there! A tool’s engineering design principles are critical as they now sets the ceiling on what AI can do with your tool for your user.</p> <p>I’m curious how others are thinking about this. Where have you seen AI genuinely compound a vis tool’s usability/usefulness, versus mostly sit on top of one?</p> <p>And again, many thanks Qianwen Wang for the invite!</p>]]></content:encoded>
    </item>
    <item>
      <title>After months of building, we're finally in closed beta at Ridge AI</title>
      <link>https://lekschas.de/blog/after-months-of-building-were-finally-in-closed</link>
      <guid isPermaLink="true">https://lekschas.de/blog/after-months-of-building-were-finally-in-closed</guid>
      <pubDate>Mon, 06 Apr 2026 12:00:00 GMT</pubDate>
      <description>Here's what Jeffrey Heer, Ellie Fields, Andy Caley, and I have been working on.</description>
      <content:encoded><![CDATA[<p>After months of building, we’re finally in closed beta at <a href="https://www.ridgedata.ai" rel="nofollow">Ridge AI</a>. Here’s what <a href="https://www.linkedin.com/in/jeffreyheer/" rel="nofollow">Jeff Heer</a>, <a href="https://www.linkedin.com/in/elliefields/" rel="nofollow">Ellie Fields</a>, <a href="https://www.linkedin.com/in/andy-caley-6214b331/" rel="nofollow">Andy Caley</a>, and I have been working on.</p> <p>A few weeks ago I wrote about how AI-native visualization tools need well-engineered constraints. While building the agents, I kept asking: which steps can we constrain to keep things focused and reliable? SQL-only queries instead of free-form code, automatic cross-chart filtering, consistent color encoding: each removes a degree of freedom, and the result is an interactive dashboard in under a minute. Leaving you free to ideate, adjust, and explore.</p> <p>The payoff is a shift in attention. Instead of thinking primarily about how to visualize your data, you can anchor on your actual goals and questions.</p> <p>If you’re interested in what we’re building and want to join the closed beta, please reach out.</p>]]></content:encoded>
    </item>
    <item>
      <title>Our panel on data visualization in the age of AI</title>
      <link>https://lekschas.de/blog/paolo-ciuccarelli-wrote-up-a-great-synthesis-of</link>
      <guid isPermaLink="true">https://lekschas.de/blog/paolo-ciuccarelli-wrote-up-a-great-synthesis-of</guid>
      <pubDate>Fri, 27 Mar 2026 12:00:00 GMT</pubDate>
      <description>One thread I keep coming back to: the engineering of constraints around AI-native tools.</description>
      <content:encoded><![CDATA[<p><a href="https://www.linkedin.com/in/paolociuccarelli/" rel="nofollow">Paolo Ciuccarelli</a> wrote up a great <a href="https://paolociuccarelli.substack.com/p/data-visualization-in-the-age-of" rel="nofollow">synthesis of our panel at Northeastern’s Design Research Week on “Data Visualization in the Age of AI.”</a></p> <p>One thread I keep coming back to: the engineering of constraints around AI-native tools.</p> <p>There’s broad consensus that AI collapses implementation time. I built dtour (<a href="https://dtour.dev" rel="nofollow">https://dtour.dev</a>) in two days as a working prototype, which would have taken me weeks/months before. But the harder, more interesting question is: what makes the output good rather than generic?</p> <p>I believe it’s about shaping the solution space. The goal of a visualization tool is to help people gain insights fast. Classic tools often have a deep learning curve before that insight rate goes up (if at all). AI-native tools can lower that curve and offer deeper insights, but only if the tool’s solution space is well-constrained to guide AI. Without constraints, you just get mediocre results faster.</p> <p>Constraints aren’t just guardrails, they’re architecture. It’s like mentoring an intern. You don’t let them explore aimlessly, but you also don’t dictate every step. You define the problem boundary, set the right level of structure, and let productive exploration happen within it. Over-constrain and the work is predictable. Under-constrain and it’s inefficient. The same holds for AI agents generating data visualizations.</p> <p><a href="https://homes.cs.washington.edu/~jheer/" rel="nofollow">Jeff Heer</a>, <a href="https://www.linkedin.com/in/elliefields/" rel="nofollow">Ellie Fields</a>, <a href="https://www.linkedin.com/in/andy-caley-6214b331/" rel="nofollow">Andy Caley</a>, and I are trying to put this into practice at <a href="https://ridgedata.ai" rel="nofollow">Ridge AI</a>: well-scoped declarative specs, automatic interactions, and hard constraints where they matter (like using SQL instead of Python for analytics) to produce useful and trustworthy analytical dashboards as fast as possible. So users can focus on what matters: answering data questions.</p> <p>The question of what’s the right level of guidance extends to the human in the loop as well. If the tool suggestions are too precise or elaborate, people might rubber-stamp and stop thinking. Too little, and AI feels unproductive. You need the right amount of friction, as Angie Boggust pointed out. I’m curious how other folks approach this balance in their work.</p>]]></content:encoded>
    </item>
    <item>
      <title>Enable AI agents to use your frontend app like a tool</title>
      <link>https://lekschas.de/blog/did-you-ever-want-to-control-your-frontend-app</link>
      <guid isPermaLink="true">https://lekschas.de/blog/did-you-ever-want-to-control-your-frontend-app</guid>
      <pubDate>Tue, 17 Feb 2026 12:00:00 GMT</pubDate>
      <description>I was curious how to make frontend apps fully programmable and built a library called MCP-Web that lets you expose state, actions, and UI as MCP tools+apps for AI while maintaining human agency.</description>
      <content:encoded><![CDATA[<p>Did you ever want to control your frontend app (like a dashboard) through AI while being able to take over at any point? I was curious how to make frontend apps fully programmable and built a library called MCP-Web that lets you expose state, actions, and UI as MCP tools+apps for AI while maintaining human agency.</p> <p>Code: <a href="https://github.com/flekschas/mcp-web" rel="nofollow">https://github.com/flekschas/mcp-web</a> Docs: <a href="https://mcp-web.dev" rel="nofollow">https://mcp-web.dev</a></p> <p>With MCP-Web, your frontend app becomes the MCP server. AI doesn’t need to parse HTML to identify possible actions. It gets typed tools to directly manipulate your frontend app’s state like your UIs do.</p> <p>This approach makes the frontend (instead of the database) the main control surface, which has a few benefits. Primarily, it makes human-AI parity straightforward. Humans control state through UIs and AI controls the very same state through MCP tools. So both have the same capabilities. This also enables mixed-initiative interactions: you can automate some tasks with natural language and use pointer interactions for others when you want to.</p> <p>Try it: <a href="https://todo.demo.mcp-web.dev" rel="nofollow">https://todo.demo.mcp-web.dev</a> is a todo app that either you or AI can fully control.</p> <p>Another benefit of making the frontend the main control surface is when your UI has rich ephemeral state that shouldn’t live in a database. Think of dashboards, visualization tools, or visual analytics with crossfilters, selections, and dynamic color scales. Or a 3D viewer with camera and display settings. These view models are often larger than the data model itself. Moreover, if you want AI to show UIs to the user (via MCP apps), the frontend is the natural place to define them as it already renders those UI components in the browser.</p> <p>A good example is the HiGlass genome browser: <a href="https://higlass.demo.mcp-web.dev" rel="nofollow">https://higlass.demo.mcp-web.dev</a> lets you browse and configure it using any MCP-compatible AI agent.</p> <p>To build AI-controllable frontend apps with MCP-Web, the main work involves modeling your frontend state declaratively. Break your state into atomic and derived units, and describe it with Zod schemas. Exposing your state as tools is then straightforward. MCP-Web comes with utilities to streamline the automatic generation of token-efficient MCP tools and apps, and is framework agnostic.</p> <p>MCP-Web also lets you trigger AI queries directly from the frontend. Your app can “ask” AI questions, not just respond to AI requests. As an example, <a href="https://checkers.demo.mcp-web.dev" rel="nofollow">https://checkers.demo.mcp-web.dev</a> is a checkers game where you play against AI. But since the app is AI-controllable, you can also let AI play against AI or have AI explain moves.</p> <p>If you’re curious about the philosophy and design decisions behind MCP-Web, keep on reading at <a href="https://mcp-web.dev/made-with-love" rel="nofollow">https://mcp-web.dev/made-with-love</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Story Behind MCP-Web</title>
      <link>https://lekschas.de/blog/the-story-behind-mcp-web</link>
      <guid isPermaLink="true">https://lekschas.de/blog/the-story-behind-mcp-web</guid>
      <pubDate>Mon, 09 Feb 2026 12:00:00 GMT</pubDate>
      <description>Why I built a library for making frontend apps equally controllable by people and AI</description>
      <content:encoded><![CDATA[<p>Over the past several months I’ve been working this library called <a href="https://mcp-web.dev" rel="nofollow">MCP-Web</a> for exposing frontend state, actions, and UIs as tools for AI agents. This post is a bit of a reflection about the journey building MCP-Web with Claude.</p> <h2>Why I Created MCP-Web</h2> <p>MCP-Web started out of curiosity. I wanted to know if it’s possible to control visual web-based data interfaces through AI while allowing users to remain in full control and be able to take over at any point.</p> <p>Visual interfaces, like dashboards or visual analytics apps, are different from other interfaces for two reasons. First, such interfaces often have a rich ephemeral view model to enable exploration. And such models are often much larger than the data model. Think of crossfilters, camera settings, or display configurations. And second, while some interactions are more efficient with natural language, others are better suited for pointer events. E.g., comparing two datasets is faster expressed in natural language while manipulating the camera position to your liking is much faster using a pointer interface.</p> <p>MCP-Web is the result of me and Claude exploring how to make it as easy as possible to build frontend apps that both humans and AI control equally well.</p> <h3>Human-AI Parity</h3> <p>A core principle that underpins MCP-Web and the design philosophy behind it is to ensure the human user never loses agency while at the same time enabling AI to effectively operate a frontend app. There should be parity between both. Whatever the human can do the AI should be able to do and vice versa.</p> <p>In the past, graphical end-user software was most often designed purely for humans interacting through screens and pointers. Unlike CLIs and APIs, GUIs were rarely built with programmatic control or integration in mind. You could argue that made sense before working AI existed, but it meant these tools became hard to automate, integrate, and learn.</p> <p>With modern LLMs, there’s really no reason anymore not to make graphical interfaces fully programmable and AI-controllable. Even when complex UIs are unavoidable — and they can be, trust me, I’ve built many — LLMs allow us to lower the entry barrier, increase accessibility, and automate the tedious parts.</p> <p>The flip side, of course, is optimizing only for AI. As great as LLMs are at automating tedious interactions, they can fail (like humans). Either by making genuine mistakes, or by the user not specifying their intent correctly. In either case it’s important to ensure the user can take over at any time to intervene if they need to.</p> <p>With human-AI parity, the user can choose which route to take, how much to automate with AI and when to take over. And it turns out, it’s fairly easy to achieve parity!</p> <h2>Two Ideas That Make Parity Easy</h2> <h3>Frontend as the Main Control Gateway</h3> <p>The key design decision with MCP-Web, and maybe the most fundamental difference between a regular MCP setup and MCP-Web, is that with MCP-Web you make the frontend the <em>main control gateway</em> to data. Instead of having an AI agent operate through MCP on the data and pushing updates to the frontend, with MCP-Web both the human and AI are essentially using the same channel: the frontend state.</p> <p>The human controls the frontend state through a graphical user interface while AI controls it through tools. The key is that both interfaces manipulate the very same state. While it doesn’t guarantee parity between humans and AI, this design at least makes it much easier to achieve parity. You just need to ensure that every state can be controlled through a GUI and an MCP tool.</p> <p>As with every design choice, making the frontend the main gateway comes with tradeoffs. First and foremost, it requires the user to run the frontend app in the browser to interact with it. This requirement also limits some use cases like multi-user interactions. However, for visual interfaces and dashboards, which are meant to be seen by the user and that have rich view states, I believe this tradeoff is justified.</p> <p>This design choice has another benefit: exposing UI components to AI agents becomes trivial. <a href="https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/" rel="nofollow">MCP apps</a>, the new extension to MCP for exposing user interfaces, let AI agents render UI for human consumption. Since the frontend already defines all UI as components, you can expose them directly from where they’re defined, rather than duplicating the UI logic.</p> <p>All this brings us to the question of what it takes, on a technical level, to achieve full AI controllability.</p> <h3>Declarative Reactive Frontend State</h3> <p>One of the main learnings from building MCP-Web is that 99% of the work to make a frontend app AI controllable has nothing to do with AI and everything to do with structuring your frontend state well.</p> <blockquote><p><strong>tl;dr</strong> Well-described declarative reactive state is all you need.</p></blockquote> <p>At the end of the day, if you model your state declaratively and break it up into atomic and derived units, then it’s dead simple to enable AI to control your frontend app. Just expose the atomic units as tools. The only other key ingredient you need are well-described schemas. That’s it. You’re done! 🎉</p> <p>Of course, there are nuances. Some states might need to be synchronized to avoid flickering and other states you might need content validation in addition to schema validation. But those things are easy to add if your state follows the declarative reactive framework.</p> <p>One might point out that AI is also becoming better and better at understanding, navigating, and controlling rendered websites of all kinds. This is true and the performance will for sure only getting better over time. However, I’d argue it’s always more efficient and effective to offer declarative schemas as they take guessing out of the game and will always be token efficient. Especially for bespoke data visualizations, some interaction patterns might require parsing minified JavaScript code, which just seems like a waste of compute.</p> <h2>Learnings From Coding with Claude</h2> <p>Another reason for creating MCP-Web was that it provided me an excuse to see how far I can get with AI coding tools like Claude Code. Needless to say you can get very far very quickly if you know where you want to go. And the progress from when I started working on this last October to now is mind-boggling. With AI coding becoming cheaper, faster, and better month by month, I find it matters more and more <em>what</em> and <em>why</em> you want to build.</p> <h3>Knowing <em>What</em> You Want to Implement</h3> <p>I keep coming back to the question of <em>what</em> to build ever since I listened to the Hard Fork episode where Casey Newton and Kevin Roose interviewed Gary Greenberg who psychoanalyzed ChatGPT. Greenberg at one point said something along the lines of “if asking questions and getting feedback essentially becomes free, what matters is which questions you actually want to ask”.</p> <p>When it comes to AI coding, I think the very same is true. If you have the financial means to pay for an AI coding tool, writing code is essentially “free”. The hard part then boils down to figuring out what exactly you want to implement and why. I.e., what problem is your software product trying to solve? Do your users actually have that problem? And is there even a reason to build shared software rather than letting each user have AI create their own bespoke solution? In other words, do the inevitable constraints your software imposes on users enable something new?</p> <p>Once you’ve figured out these fundamental questions and you move to the coding phase, I learned that it matters just as much how you ask AI. The challenge is that the framing questions can inadvertently constrain the answers. If I ask “Should I use option A or B?”, AI will likely pick one, even when the real answer might be “Neither, consider C instead.” To avoid this, I find it better to pose open-ended questions, like “What viable approaches can you imagine for X?”, to prevent priming the conversation. (The same is true for human collaboration by the way). So beyond knowing <em>what</em> to build, I find it’s important to know how to ask the right question.</p> <p>I wish there was a dedicated <em>explore</em> or <em>discuss</em> mode in Claude Code that focuses on offering different perspectives. Planning is great when you already know where you want to go and “only” want to flesh out the path of how to get to your target. I know you can get there using skills but it’d be wonderful if this was a first class feature. What, for instance, if your goal is not optimal? Or if there’s a totally different approach that’d turn out to be better?</p> <h3>The Old is The New</h3> <p>Many discoveries in this new age of AI software engineering are rediscoveries of things that were known for a long time.</p> <p>For instance, execution is easier than planning, which is why it takes a lot longer to write a PhD thesis than a Bachelor thesis. For the latter your professor has already created a plan for you to execute while a PhD requires you to come up with a research plan yourself. And related to knowing <em>what to ask</em> AI to code, the hardest step is finding out what research to conduct and plan out.</p> <p>Another example are evals, which are a hot topic everywhere right now. But evals are essentially just codified ways of grading, which teachers and professors had to deal with for centuries. I would also argue evals are just tests with non-deterministic outcomes that need grading. You’re testing against a distribution of outcomes instead of a single outcome.</p> <p>Lastly, AI agent workflows and orchestration from a conceptual execution point of view share a lot of similarity with what computer scientists in the human-computer interaction community have studied under the topic of crowdsourcing. In both cases you deal with agents you cannot perfectly predict and that may or may not give you correct results.</p> <p>Treating all problems as new when the technology changes is not a new phenomenon by any means. But while there’s a lot of excitement around the new, I find it helpful to remind myself that many challenges we run into with AI coding have historic parallels that offer useful learnings.</p> <p>MCP-Web itself is a good example. Almost nothing in it is truly new. Declarative state? Established long ago in SQL, functional programming, and the grammar of graphics. Reactive frontend state? Knockout.js introduced computed observables over a decade ago. The patterns are old; the context is new.</p> <h2>What’s Next?</h2> <p>I’m pretty happy with the approach behind MCP-Web and what it can already do but it’s far from done. As always there are more things we can and will add. For now, I’m curious to see if others will find this library useful as well or whether I failed in my belief or approach to AI controllable frontend apps that offer human-AI parity.</p> <p>In any case, it was fun building MCP-Web with Claude and at the very least I learned a bunch myself.</p>]]></content:encoded>
    </item>
    <item>
      <title>I'm joining Ridge AI</title>
      <link>https://lekschas.de/blog/happy-to-share-that-ive-joined-jeffrey-heer-and</link>
      <guid isPermaLink="true">https://lekschas.de/blog/happy-to-share-that-ive-joined-jeffrey-heer-and</guid>
      <pubDate>Tue, 30 Sep 2025 12:00:00 GMT</pubDate>
      <description>At Ridge we're building AI-native tools that let users intelligently create and explore data-rich visualization dashboards. I'm excited to push the boundary of AI-driven mixed-initiative visual dat…</description>
      <content:encoded><![CDATA[<p>Happy to share that I’ve joined <a href="https://homes.cs.washington.edu/~jheer/" rel="nofollow">Jeff Heer</a> and <a href="https://www.linkedin.com/in/elliefields/" rel="nofollow">Ellie Fields</a>’s team at Ridge AI as a Founding Research Engineer!</p> <p>At <a href="https://www.ridgedata.ai" rel="nofollow">Ridge AI</a>, we’re building AI-native tools that let users intelligently create and explore data-rich visualization dashboards. I’m excited to push the boundary of AI-driven mixed-initiative visual data systems with such an amazing team.</p> <p>To support large-scale datasets commonly found across industries, Ridge AI builds on the Mosaic architecture for scalable interactive data applications. Check out Jeff’s introduction: <a href="https://www.ridgedata.ai/blog/mosaic-architecture" rel="nofollow">https://www.ridgedata.ai/blog/mosaic-architecture</a></p> <p>If you’re working with large-scale datasets and want better ways to visually explore them, let’s chat!</p>]]></content:encoded>
    </item>
    <item>
      <title>Leaving Ozette after 4+ incredible years</title>
      <link>https://lekschas.de/blog/after-4-incredible-years-at-ozette-im-closing</link>
      <guid isPermaLink="true">https://lekschas.de/blog/after-4-incredible-years-at-ozette-im-closing</guid>
      <pubDate>Wed, 17 Sep 2025 12:00:00 GMT</pubDate>
      <description>I'm immensely grateful to have been part of the fantastic team that Greg Finak and Evan Greene assembled. I've learned a lot and am proud of what we built together: an end-to-end platform for analy…</description>
      <content:encoded><![CDATA[<p>After 4+ incredible years at <a href="https://ozette.com" rel="nofollow">Ozette</a>, I’m closing this chapter. I’m immensely grateful to have been part of the fantastic team that <a href="https://www.linkedin.com/in/gregfinak/" rel="nofollow">Greg</a> and <a href="https://www.linkedin.com/in/evan-greene-389929238/" rel="nofollow">Evan</a> assembled. I’ve learned a lot and am proud of what we built together: an end-to-end platform for analyzing single-cell flow cytometry data where intelligent visualization helps steer ML models and drives productive insights.</p> <p>Special thanks to my research interns <a href="https://trevorma.nz" rel="nofollow">Trevor</a>, <a href="https://devinlange.com" rel="nofollow">Devin</a>, and <a href="https://universalities.com" rel="nofollow">Jane</a>. It was great having you at Ozette and I deeply enjoyed doing impactful research together that pushed visual analytics forward and resulted in new production-deployed features.</p> <p>I’m taking a short break to recharge and am super excited for my next journey! More details coming soon.</p>]]></content:encoded>
    </item>
    <item>
      <title>Heading to CYTO?</title>
      <link>https://lekschas.de/blog/heading-to-cyto2025</link>
      <guid isPermaLink="true">https://lekschas.de/blog/heading-to-cyto2025</guid>
      <pubDate>Thu, 29 May 2025 12:00:00 GMT</pubDate>
      <description>We've been busy adding new capabilities to the conversational dashboard agent we launched a few weeks ago.</description>
      <content:encoded><![CDATA[<p>Heading to CYTO? We’ve been busy adding new capabilities to the conversational dashboard agent we launched a few weeks ago.</p> <p>Exploring single-cell data can be challenging as the underlying science, data generation, and analysis is complex. To make it easier to get started, our recently-introduced AI agent enables you to chat with your data to quickly uncover insights.</p> <p>Compared to classic chat interfaces, our agent not only provides text answers but also reconfigures the dashboard to visualize and highlight relevant data patterns. For instance, ask “Which T cell populations show activation markers?” and watch the dashboard automatically filter, highlight, and annotate relevant clusters.</p> <p>Importantly, you remain in full control and can seamlessly switch between mouse and conversational interactions. Whatever the agent can do, you can do. To highlight how the agent adjusted the dashboard, you can now select an answer which shows all related UI elements.</p> <p>The agent can now also trigger platform functions, like the newly added phenotype simplification feature that allows for finding simpler phenotypes that still express the same abundance pattern. You could think of this like feature selection for marker expressions.</p> <p>Single-cell analysis shouldn’t require a PhD in data visualization. Our agent helps you get started as quickly as possible so you can focus on the biology instead of the UI.</p> <p>To learn more and see the agent live, say 👋 to our team <a href="https://www.linkedin.com/in/cherie-green-09794724/" rel="nofollow">Cherie Green</a>, <a href="https://www.linkedin.com/in/evan-greene-389929238/" rel="nofollow">Evan Greene</a>, <a href="https://www.linkedin.com/in/gregfinak/" rel="nofollow">Greg Finak</a>, <a href="https://www.linkedin.com/in/kurtvangunst/" rel="nofollow">Kurt Van Gunst</a>, and <a href="https://www.linkedin.com/in/corrieortega/" rel="nofollow">Corrie Ortega</a> at CYTO.</p>]]></content:encoded>
    </item>
    <item>
      <title>Jupyter Scatter gets support for text labels</title>
      <link>https://lekschas.de/blog/new-version-of-jupyter-scatter-is-out</link>
      <guid isPermaLink="true">https://lekschas.de/blog/new-version-of-jupyter-scatter-is-out</guid>
      <pubDate>Tue, 20 May 2025 12:00:00 GMT</pubDate>
      <description>🥳 Adding long-overdue support for text labels that make it easier to correlate points with your underlying data.</description>
      <content:encoded><![CDATA[<p>New version of Jupyter Scatter is out! 🥳 Adding long-overdue support for text labels that make it easier to correlate points with your underlying data.</p> <p>Designing a generic DataFrame-driven method that integrates with Jupyter Scatter’s overall API design was a fun challenge. I ended up modeling the label assignment via categorical/string columns, which groups points and shows a single text label per group. Point labels are also supported and you can assign as many label types as you need.</p> <p>To learn how to use the new labeling feature see:</p> <ul><li>Code: <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a></li> <li>Docs: <a href="https://jupyter-scatter.dev/labels" rel="nofollow">https://jupyter-scatter.dev/labels</a></li> <li>Demos: <a href="https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/6-Labels.ipynb" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/6-Labels.ipynb</a></li></ul> <p>The label placement is implemented using a dynamic map labeling approach to avoid over-plotting while maximizing the labels that can be shown across zoom levels. Label positions are computed upfront for performant rendering and can be persisted as parquet files for fast re-use. Additionally, the label data is tiled to allow limiting the total number of labels per tile and enable scaling to hundreds of thousands of labels.</p> <p>Some fantastic libraries I learned about and use for labeling:</p> <ul><li>Jeffrey Heer’s <a href="https://github.com/uwdata/flechette" rel="nofollow">Flechette</a> is a fast and lightweight library for loading Apache Arrow. Jupyter Scatter uses it to send label information between Python &lt;> JS kernels as binary data. Flechette is perfect for this! Really nice work Jeff. 👏</li> <li>Kyle Barron’s <a href="https://github.com/kylebarron/geo-index" rel="nofollow">geoindex</a> is a fast, memory-efficient, zero-copy spatial indexing library for Python. Essentially the counterpart to Volodymyr Agafonkin’s fantastic <a href="https://github.com/mourner/kdbush" rel="nofollow">KDBush</a> which we’re using under the hood in regl-scatterplot already for statically indexing 2D points. 🙌</li> <li>Rye Terrell’s awesome<a href="https://github.com/wwwtyro/candygraph/" rel="nofollow">Candygraph</a> library for plotting 2D charts with WebGL heavily inspired our text measurement implementation. Efficiently and precisely measuring the labels’ dimensions is critical for handling many text labels. 👏</li> <li>Thilo Spinner’s <a href="https://github.com/spinthil/pycolormap-2d" rel="nofollow">Colormap 2D</a> is a library implementing various 2D color maps from Steiger et al.’s (2015) “Explorative analysis of 2D color maps”. 2D color maps are an excellent way to color points in data maps with many categories/groups/labels. 🙌</li></ul> <p>Finally, shoutouts to Trevor Manz for reviewing the quite involved PR and Leland McInnes’ wonderful <a href="https://github.com/TutteInstitute/datamapplot" rel="nofollow">DataMapPlot library</a> which inspired the 2D color map integration and has many excellent shared examples. 🙏</p> <p>Let me know what you think and happy scatter plot labeling 🏷️</p>]]></content:encoded>
    </item>
    <item>
      <title>Thrilled to announce that after a year of research and development, our</title>
      <link>https://lekschas.de/blog/thrilled-to-announce-that-after-a-year-of</link>
      <guid isPermaLink="true">https://lekschas.de/blog/thrilled-to-announce-that-after-a-year-of</guid>
      <pubDate>Fri, 09 May 2025 12:00:00 GMT</pubDate>
      <description>This feature transforms how scientists interact with complex biological datasets - simply chat with your data to quickly uncover insights without needing to master the UI first.</description>
      <content:encoded><![CDATA[<p>Thrilled to announce that after a year of research and development, our conversational visual analytics dashboard for single-cell data is now live! 🎉</p> <p>This feature transforms how scientists interact with complex biological datasets - simply chat with your data to quickly uncover insights without needing to master the UI first.</p> <p>Working with the wonderful <a href="https://universalities.com" rel="nofollow">Jane Adams</a>, we tackled a fundamental challenge in life sciences visualization: how do we make complex visual analytics dashboards more accessible from a data exploration perspective?</p> <p>Our solution is a mixed-initiative system where:</p> <ul><li>An LLM-powered agent reconfigures the dashboard in response to natural language queries</li> <li>Users maintain complete control and can seamlessly switch between conversation and direct manipulation</li> <li>The agent operates within the same constraints as human users, ensuring all responses are verifiable and grounded in Ozette’s high-quality and standardized analysis pipelines</li></ul> <p>Unlike a classic chat interface, our AI agent doesn’t just generate text - it drives actual dashboard reconfigurations that show you the evidence behind its answers through interactive and linked visualizations.</p> <p>This bridges the gap between conversation and visual data exploration, dramatically reducing the learning curve for complex scientific dashboards.</p> <p>Huge thanks to the entire <a href="https://ozette.com" rel="nofollow">Ozette team</a> and especially to Jane Adams who developed the initial prototype during her internship with us last year. 👏</p> <p>We’ll share more details in the coming weeks/months.</p>]]></content:encoded>
    </item>
    <item>
      <title>My ISMB BioVis keynote on challenges and opportunities for BioVis software tools</title>
      <link>https://lekschas.de/blog/in-case-you-missed-last-years-ismb-iscb</link>
      <guid isPermaLink="true">https://lekschas.de/blog/in-case-you-missed-last-years-ismb-iscb</guid>
      <pubDate>Thu, 20 Feb 2025 12:00:00 GMT</pubDate>
      <description>My keynote on challenges and opportunities for BioVis software tools is available at</description>
      <content:encoded><![CDATA[<p>In case you missed last year’s ISMB, they recently uploaded all talks to YouTube. My keynote on challenges and opportunities for BioVis software tools is available at <a href="https://www.youtube.com/watch?v=ovV0LqImldI" rel="nofollow">https://www.youtube.com/watch?v=ovV0LqImldI</a></p> <p>Another highlight from ISMB BioVis is Devin Lange’s talk on a novel visualization method for aggregating annotated single-cell heatmaps. <a href="https://www.devinlange.com" rel="nofollow">Devin Lange</a> presents his internship research work from Ozette: <a href="https://www.youtube.com/watch?v=U8R1QrKTsbg" rel="nofollow">https://www.youtube.com/watch?v=U8R1QrKTsbg</a> (Pssst Devin actually gave two fantastic talks at ISMB BioVis! Make sure to check them both out! Great job Devin 👏)</p> <p>You can find all ISMB BioVis talks at <a href="https://www.youtube.com/watch?v=kZxwndSEELw&amp;list=PLmX8XnLr6zeEBBmvt6QI6RiiJFvpx8Xdh" rel="nofollow">https://www.youtube.com/watch?v=kZxwndSEELw&amp;list=PLmX8XnLr6zeEBBmvt6QI6RiiJFvpx8Xdh</a></p> <p>Happy watching :)</p>]]></content:encoded>
    </item>
    <item>
      <title>A new version of Jupyter Scatter is out: v0.21.0</title>
      <link>https://lekschas.de/blog/a-new-version-of-jupyter-scatter-is-out-v0-21-0</link>
      <guid isPermaLink="true">https://lekschas.de/blog/a-new-version-of-jupyter-scatter-is-out-v0-21-0</guid>
      <pubDate>Tue, 18 Feb 2025 12:00:00 GMT</pubDate>
      <description>🥳 This version introduces fun new ways to select points using either a brush or rectangle. You can now also more easily extend or reduce a selection by holding down the meta (CMD on macOS) key or…</description>
      <content:encoded><![CDATA[<p>A new version of <a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a> is out: v0.21.0. 🥳 This version introduces fun new ways to select points using either a brush or rectangle. You can now also more easily extend or reduce a selection by holding down the meta (CMD on macOS) key or alt key respectively.</p> <p>The brush selection can be useful when working with temporal or sequential patterns. Huge kudos to <a href="https://www.linkedin.com/in/andres-colubri/" rel="nofollow">Andres Colubri</a> who brought up that idea and the initial implementation for <a href="https://github.com/flekschas/regl-scatterplot" rel="nofollow">regl-scatterplot</a> (Jupyter Scatter’s rendering engine).</p> <p>To test the new brush selection mode, I integrated Jupyter Scatter with a novel algorithm called <a href="https://arxiv.org/abs/2404.07386" rel="nofollow">DimBridge</a> by <a href="https://mwli.net/" rel="nofollow">Mingwei Li</a> and <a href="https://www.cs.tufts.edu/~remco/" rel="nofollow">Remco Chang</a> et al. DimBridge aspires to identify key dimensions in the high-dimensional space that explain a subset of points in the lower-dimensional embedding. For instance, imagine working with a 2D UMAP or t-SNE plot of a 100 dimensional dataset and you see an interesting pattern. The idea of DimBridge is to tell you which handful of dimensions from the dataset can explain the pattern you’re seeing in the embedding plot.</p> <p>Using a single-cell surface protein dataset from <a href="https://www.nature.com/articles/s41586-022-04718-w" rel="nofollow">Florian Mair et al.</a> that we analyzed with Ozette’s Cell Discovery method (an extension of Evan Greene et al.’s <a href="https://www.cell.com/patterns/fulltext/S2666-3899(21)00234-8" rel="nofollow">FAUST method</a>) and embedded with <a href="https://jmlr.org/papers/v9/vandermaaten08a.html" rel="nofollow">t-SNE</a>, you can use Jupyter Scatter to select a cluster and have DimBridge compute the key protein expressions of that cluster. You can also contrast two or more selections to identify proteins that differentiate them. Or you can use the brush selection to study a sequence of selections in the dataset.</p> <p>To test it out yourself, head over to <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a>, clone the repo, cd into notebooks, and run <code>juv run dimbridge.ipynb</code>. This requires you to have <a href="https://github.com/manzt/juv" rel="nofollow">juv</a> installed, a super handy new tool from Trevor Manz that makes Jupyter Notebooks reproducible! I highly recommend you check it out if you haven’t.</p>]]></content:encoded>
    </item>
    <item>
      <title>A host of fantastic tools for working with genomics data</title>
      <link>https://lekschas.de/blog/if-youre-working-in-genomics-check-out-the</link>
      <guid isPermaLink="true">https://lekschas.de/blog/if-youre-working-in-genomics-check-out-the</guid>
      <pubDate>Fri, 07 Feb 2025 12:00:00 GMT</pubDate>
      <description>To cite a few from the blog post:</description>
      <content:encoded><![CDATA[<p>If you’re working in genomics, check out the fantastic tools <a href="https://abdenlab.org/" rel="nofollow">Nezar Abdennur</a>‘s lab has been putting out. 👏</p> <p>To cite a few from the blog post:</p> <ul><li><p><a href="https://bioframe.readthedocs.io/" rel="nofollow">Bioframe</a> brings genomic interval operations natively to Pandas DataFrames. It operates directly on data frames rather than specialized data structures or wrapper objects.</p></li> <li><p><a href="https://pairtools.readthedocs.io/" rel="nofollow">Pairtools</a> is a critical suite of command line tools for processing and interpreting sequence alignments from proximity ligation NGS assays, like Hi-C.</p></li> <li><p><a href="https://open2c.github.io/cooler/" rel="nofollow">Cooler</a> is a scalable file format and support package for storing multi-scale contact matrices and other genomic interaction maps.</p></li> <li><p><a href="https://cooltools.readthedocs.io/" rel="nofollow">Cooltools</a> provides common downstream analysis for Hi-C data.</p></li></ul> <p>Looking forward to what you guys release in 2025!</p>]]></content:encoded>
    </item>
    <item>
      <title>Wrapping 2024 with a new version of Jupyter Scatter</title>
      <link>https://lekschas.de/blog/before-2024-is-a-wrap-here-is-a-new-version-of</link>
      <guid isPermaLink="true">https://lekschas.de/blog/before-2024-is-a-wrap-here-is-a-new-version-of</guid>
      <pubDate>Mon, 30 Dec 2024 12:00:00 GMT</pubDate>
      <description>🎉 This release adds support for full-screen mode, which makes it easier to explore large-scale scatter plots. In full-screen mode, you can also create customized high-resolution exports for presen…</description>
      <content:encoded><![CDATA[<p>Before 2024 is a wrap, here is a new version of <a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a> (v0.20)! 🎉 This release adds support for full-screen mode, which makes it easier to explore large-scale scatter plots. In full-screen mode, you can also create customized high-resolution exports for presentations and publications.</p> <p>GitHub: <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a> Docs: <a href="https://jupyter-scatter.dev" rel="nofollow">https://jupyter-scatter.dev</a></p> <p>Another addition is the ability to change the point size’s zoom scale function. By default, points are scaled up using the inverse hyperbolic sine, which enlarges points sublinearly. This reveals structure of overlapping point clusters as you zoom in. But sometimes it can be useful to keep the point size constant (e.g., <code>scatter.size(scale_function='constant')</code>) or enlarge points linearly (e.g., <code>scatter.size(scale_function='linear')</code>). Finally, you can also now lock the camera view with <code>scatter.camera(is_fixed=True)</code> to avoid zooming in as you scroll through your notebook.</p> <p>To give Jupyter Scatter a try is now easier than ever: ➡️ <code>uvx jupyter-scatter demo</code></p> <p>(This fantastic feature is shamelessly copied from Trevor Manz who implemented it for <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">cev</a>. Huuuge thanks Trevor 🙏)</p> <p>Under the hood, we’ve modernized, i.e., rustified, the tooling by switching to Biome for JS code formatting and uv for Python package management. The minimum Python version is now 3.9. (Again massive thanks to Trevor Manz for taking on the switch to uv. Also a big shout out to the fantastic folks behind Biome and uv 👏)</p> <p>See the full changelog at <a href="https://github.com/flekschas/jupyter-scatter/blob/main/CHANGELOG.md" rel="nofollow">https://github.com/flekschas/jupyter-scatter/blob/main/CHANGELOG.md</a> and let me know what you think!</p> <p>And most importantly, Guten Rutsch and Happy new Year! 🥳</p>]]></content:encoded>
    </item>
    <item>
      <title>Comparative embedding visualizations published at IEEE VIS</title>
      <link>https://lekschas.de/blog/i-am-thrilled-to-share-that-our-work-on</link>
      <guid isPermaLink="true">https://lekschas.de/blog/i-am-thrilled-to-share-that-our-work-on</guid>
      <pubDate>Mon, 30 Sep 2024 12:00:00 GMT</pubDate>
      <description>In the paper, we introduce a powerful framework and computational metrics for comparing embedding visualizations across class-label hierarchies to help discover meaningful differences quickly.</description>
      <content:encoded><![CDATA[<p>I am thrilled to share that our work on <a href="https://doi.org/10.1109/TVCG.2024.3456370" rel="nofollow">comparative embedding visualizations</a> is published at the premier <a href="https://ieeevis.org" rel="nofollow">IEEE VIS conference</a>. In the paper, we introduce a powerful framework and computational metrics for comparing embedding visualizations across class-label hierarchies to help discover meaningful differences quickly.</p> <p>➡️ Test it yourself: <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a></p> <p>When working with multiple large-scale datasets (e.g., single-cell data), tools like t-SNE, UMAP, PCA, etc. are frequently used for plotting to get an understanding of the class distributions (like cell phenotypes). Unfortunately, when comparing multiple such plots (e.g., from two experimental conditions or two embedding models), the size, complexity, and distribution shifts of the data can make it challenging to identify changes.</p> <p>Our solution is to compute metrics for groups of points as defined by class labels. This allows us to compare datasets without point correspondences and surface insights at different semantic levels. We do this by constructing a Delaunay neighborhood graph and dividing it into a core, context, and combined region for each class. Using the resulting subgraphs we summarize the class distributions to derive three metrics: confusion, neighborhood, and size. Confusion quantifies the visual intermixing of classes. Neighborhood measures the stability of neighboring class labels. And Size assesses relative class size differences in their local neighborhoods.</p> <p>To evaluate and apply our framework+metrics we developed and open-sourced a Python-based prototype for Jupyter Notebook-like environments called <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">CEV</a>. Using Rust for computing the metrics, <a href="https://anywidget.dev" rel="nofollow">anywidget</a> for the widget architecture, and <a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a> for rendering, CEV scales to datasets with millions of points. See <a href="https://github.com/OzetteTech/comparative-embedding-visualization/tree/main/notebooks" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization/tree/main/notebooks</a> for examples.</p> <p>This fantastic work was led by the wonderful <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> from <a href="https://hidivelab.org/" rel="nofollow">Nils Gehlenborg</a>’s lab and started as <a href="https://ozette.com" rel="nofollow">Ozette</a>’s first graduate research internship. With contributions from our Chief Technology Officer Greg Finak and Chief Data Science Research Officer Evan Greene, this was a fruitful long-term collaboration.</p> <p>At Ozette we’re trying to push the boundary in single-cell analysis, not just by developing cutting edge machine learning methods but also by expanding the possibilities for efficient data exploration and discovery of actionable insights. This is just the first of several research projects on intelligent and scalable visual data exploration for single-cell data that we’re working on.</p>]]></content:encoded>
    </item>
    <item>
      <title>🎉 Our Jupyter Scatter paper was published</title>
      <link>https://lekschas.de/blog/excited-to-share-our-jupyter-scatter-paper-was</link>
      <guid isPermaLink="true">https://lekschas.de/blog/excited-to-share-our-jupyter-scatter-paper-was</guid>
      <pubDate>Wed, 18 Sep 2024 12:00:00 GMT</pubDate>
      <description>What's Jupyter Scatter? It's an interactive scatter plot widget for exploring large-scale datasets in Jupyter Notebook/Lab, VSCode, and Google Colab with ease.</description>
      <content:encoded><![CDATA[<p>🎉 Excited to share: Our Jupyter Scatter paper was published in the <a href="https://joss.theoj.org/papers/10.21105/joss.07059" rel="nofollow">Journal of Open Source Software (JOSS)</a> last week! 📊</p> <p>What’s <a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a>? It’s an interactive scatter plot widget for exploring large-scale datasets in Jupyter Notebook/Lab, VSCode, and Google Colab with ease.</p> <p>But who cares about a software paper? 😅 To make the publications interesting, I added support for line-based annotations. You can now draw horizontal, vertical, or arbitrary lines to help locate and compare the position of points and clusters. For instance, to emphasize the point density you can now draw contour lines. For API details see <a href="https://jupyter-scatter.dev/annotations" rel="nofollow">https://jupyter-scatter.dev/annotations</a> and for examples checkout <a href="https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/5-Cluster-Outlines-Contours.ipynb" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/5-Cluster-Outlines-Contours.ipynb</a>.</p> <p>I’ve also updated the Jupyter Scatter tutorial with an example on how to implement text-based search using Jupyter’s Text widget and Jupyter Scatter’s <code>selection()</code> and <code>zoom()</code> method. See <a href="https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/5-Search.ipynb" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/5-Search.ipynb</a>.</p> <p>Want to learn more?</p> <ul><li>Paper: <a href="https://joss.theoj.org/papers/10.21105/joss.07059" rel="nofollow">https://joss.theoj.org/papers/10.21105/joss.07059</a></li> <li>GitHub: <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a></li> <li>Docs: <a href="https://jupyter-scatter.dev" rel="nofollow">https://jupyter-scatter.dev</a></li> <li>Tutorials: <a href="https://github.com/flekschas/jupyter-scatter-tutorial" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial</a></li> <li>SciPy ‘23 Talk: <a href="https://www.youtube.com/watch?v=RyC5ixtQG-Q" rel="nofollow">https://www.youtube.com/watch?v=RyC5ixtQG-Q</a></li></ul> <p>Big thanks to Trevor Manz for his fantastic contributions to this multi-year project!</p>]]></content:encoded>
    </item>
    <item>
      <title>The Insight's in the Details</title>
      <link>https://lekschas.de/blog/how-do-we-build-data-visualization-tools-for</link>
      <guid isPermaLink="true">https://lekschas.de/blog/how-do-we-build-data-visualization-tools-for</guid>
      <pubDate>Mon, 15 Jul 2024 12:00:00 GMT</pubDate>
      <description>In my invited keynote talk at ISMB BioVis, I discussed the challenges and opportunities in creating integrated, composable, scalable, and interactive BioVis tools. At Ozette, we embrace these princ…</description>
      <content:encoded><![CDATA[<p>How do we build data visualization tools for large-scale biomedical data to help scientists surface insights quickly?</p> <p>In my invited keynote talk at ISMB BioVis, I discussed the challenges and opportunities in creating integrated, composable, scalable, and interactive BioVis tools. At Ozette, we embrace these principles to build insightful and intelligent data visualization systems, enabling rapid identification of cellular biomarkers from large-scale single-cell data.</p> <p>Key takeaways from my talk:</p> <ul><li>Integrating BioVis tools into the compute and data ecosystem is essential for ensuring that insights can be gained fast.</li> <li>BioVis tools should be composable as complex analyses often require multiple visualizations to explain patterns.</li> <li>Scalability is essential for handling the vast amounts of data generated in biomedical research.</li> <li>Bidirectional interactivity is key to creating intelligent visualizations that offer AI/ML-guidance during exploration.</li></ul> <p>**In case you missed it, feel free to <a href="https://speakerdeck.com/flekschas/the-insights-in-the-details-challenges-and-opportunities-for-biovis-software-tools" rel="nofollow">browse through my slides</a>. The recording will be available on ISMB’s YouTube channel soon.</p> <p>Some notable software tools that make it easier than ever to build integrated, composable, scalable, and (bidirectionally) interactive software are:</p> <ul><li><a href="https://anywidget.dev" rel="nofollow">Anywidget</a>: Custom Jupyter widgets made easy.</li> <li><a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a>: Explore datasets with millions of data points in Jupyter.</li> <li><a href="https://github.com/OzetteTech/comparative-embedding-visualization/" rel="nofollow">Comparative Embedding Visualization</a>: Compare two embeddings with shared labels.</li> <li><a href="http://higlass.io" rel="nofollow">HiGlass</a>: Explore and compare genomic contact matrices.</li> <li><a href="https://github.com/gosling-lang" rel="nofollow">Gosling</a>: Scalable linked interactive nucleotide graphics.</li> <li><a href="https://genomespy.app" rel="nofollow">GenomeSpy</a>: GPU-accelerated rendering for genomic data.</li> <li><a href="https://upset.app" rel="nofollow">Upset</a>: Visualize intersecting sets effectively.</li> <li><a href="http://vitessce.io" rel="nofollow">Vitessce</a>: Explore spatial single-cell experiment data.</li> <li><a href="http://viv.gehlenborglab.org" rel="nofollow">Viv</a>: Interactive visualization of high-resolution bioimaging datasets.</li> <li><a href="https://github.com/abdenlab/ipylangchat/" rel="nofollow">ipylangchat</a>: Serverless Jupyter chat UI for LangChain conversational AIs.</li> <li><a href="https://github.com/wwwtyro/candygraph" rel="nofollow">CandyGraph</a>: Fast 2D plotting for huge datasets.</li> <li><a href="https://deck.gl" rel="nofollow">Deck</a>.gl: GPU-powered framework for large dataset analysis.</li> <li><a href="https://datashader.org" rel="nofollow">DataShader</a>: Accurate rendering of the largest data.</li> <li><a href="https://idl.uw.edu/mosaic/" rel="nofollow">Mosaic</a>: Extensible framework for scalable data visualization.</li></ul> <p>This list is not exhaustive. If you know other great BioVis tools, please share them!</p> <p>Last but not least, huge shoutouts to Trevor Manz, Ashley Wilson, Nezar Abdennur, PhD, and Arpan Neupane for their feedback on my talk and help with the examples and demos. 🙏</p>]]></content:encoded>
    </item>
    <item>
      <title>ISMB BioVis '24</title>
      <link>https://lekschas.de/blog/if-youre-at-ismb-and-interested-in-the-latest</link>
      <guid isPermaLink="true">https://lekschas.de/blog/if-youre-at-ismb-and-interested-in-the-latest</guid>
      <pubDate>Sun, 14 Jul 2024 12:00:00 GMT</pubDate>
      <description>As one of the two invited keynote speakers, I'm super excited to talk about challenges in BioVis software tools and how we can overcome them with software best-practices and new exciting frameworks.</description>
      <content:encoded><![CDATA[<p>If you’re at ISMB and interested in the latest news and development around biological data visualization, check out the <a href="http://biovis.net/2024/" rel="nofollow">BioVis symposium</a> in room 521 today!</p> <p>As one of the two invited keynote speakers, I’m super excited to talk about challenges in BioVis software tools and how we can overcome them with software best-practices and new exciting frameworks.</p> <p>I’ll will discuss these practices and frameworks using examples from my visualization research in genomics and single-cell biology and the broader BioVis community.</p> <p>Putting everything together, I’ll show a quick prototype of how we can make conventional BioVis software tools “intelligent” through bi-directional interaction between a user, the visualization, and an LLM.</p> <p>Full BioVis Program: <a href="http://biovis.net/2024/program_ismb/" rel="nofollow">http://biovis.net/2024/program_ismb/</a></p> <p>Data in the video from Mair et al., 2022: <a href="https://www.nature.com/articles/s41586-022-04718-w" rel="nofollow">https://www.nature.com/articles/s41586-022-04718-w</a> Tool in the video from Manz et al., 2024: <a href="https://github.com/OzetteTech/comparative-embedding-visualization/" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Ozette‘s last year grad research intern Devin Lange is showcasing his</title>
      <link>https://lekschas.de/blog/ozette-s-last-year-grad-research-intern-devin</link>
      <guid isPermaLink="true">https://lekschas.de/blog/ozette-s-last-year-grad-research-intern-devin</guid>
      <pubDate>Sun, 14 Jul 2024 12:00:00 GMT</pubDate>
      <description>Discovering high-resolution cell phenotypes is essential for finding biological meaningful biomarkers. However, at a first sight the details can be overwhelming. With Devin‘s work we‘re able to sim…</description>
      <content:encoded><![CDATA[<p><a href="https://ozette.com" rel="nofollow">Ozette</a>‘s last year grad research intern <a href="https://www.devinlange.com" rel="nofollow">Devin Lange</a> is showcasing his internship project on aggregatable annotated single-cell heatmaps at #ISMB - BioVis 📊 with flying colors!</p> <p>Discovering high-resolution cell phenotypes is essential for finding biological meaningful biomarkers. However, at a first sight the details can be overwhelming. With Devin‘s work we‘re able to simplify the visualization without sacrifying the insights that can be surfaced.</p>]]></content:encoded>
    </item>
    <item>
      <title>📢 Tooltip support landed in Jupyter Scatter</title>
      <link>https://lekschas.de/blog/a-new-version-of-jupyter-scatter-is-out-which</link>
      <guid isPermaLink="true">https://lekschas.de/blog/a-new-version-of-jupyter-scatter-is-out-which</guid>
      <pubDate>Sat, 17 Feb 2024 12:00:00 GMT</pubDate>
      <description>Tooltips can aid in understanding the data points and patterns in a scatter plot. In Jupyter Scatter, they can include visually-encoded and other data properties and include small visualizations of…</description>
      <content:encoded><![CDATA[<p>📢 A new version of <a href="https://jupyter-scatter.dev" rel="nofollow">Jupyter Scatter</a> is out which adds support for tooltips! Tooltips can aid in understanding the data points and patterns in a scatter plot. In Jupyter Scatter, they can include visually-encoded and other data properties and include small visualizations of the data distributions. Additionally, tooltips can include a media preview like text, an image, or audio to further foster sense-making.</p> <p>See <a href="https://jupyter-scatter.dev/tooltip" rel="nofollow">https://jupyter-scatter.dev/tooltip</a> for more details. And check out <a href="https://github.com/flekschas/jupyter-scatter-tutorial" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial</a> for examples and demos.</p>]]></content:encoded>
    </item>
    <item>
      <title>SciPy '23 talks are online</title>
      <link>https://lekschas.de/blog/in-case-you-missed-this-years-scipy-conference</link>
      <guid isPermaLink="true">https://lekschas.de/blog/in-case-you-missed-this-years-scipy-conference</guid>
      <pubDate>Fri, 25 Aug 2023 12:00:00 GMT</pubDate>
      <description>📢 My talk on Jupyter Scatter – a widget for exploring large-scale datasets through interactive &amp; linked scatter plots – is available at You can find the accompanying demo notebooks at</description>
      <content:encoded><![CDATA[<p>In case you missed this year’s <a href="https://www.scipy2023.scipy.org" rel="nofollow">SciPy Conference</a>, the talks are slowly rolling out on YouTube: <a href="https://youtube.com/@SciPy-Conf" rel="nofollow">https://youtube.com/@SciPy-Conf</a>! 🎉</p> <p>📢 My talk on Jupyter Scatter – a widget for exploring large-scale datasets through interactive &amp; linked scatter plots – is available at <a href="https://youtu.be/RyC5ixtQG-Q" rel="nofollow">https://youtu.be/RyC5ixtQG-Q</a> You can find the accompanying demo notebooks at <a href="https://github.com/flekschas/jupyter-scatter-tutorial" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial</a></p> <p>🙏 Many thanks to <a href="https://trevorma.nz" rel="nofollow">Trevor Manz</a> for helping with the tutorials! In particular the cool genomics application with HiGlass, which I unfortunately didn’t have time to demo in the talk but you can check it out at <a href="https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/3-Genomics.ipynb" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial/blob/main/notebooks/3-Genomics.ipynb</a></p> <p>➡️ <a href="https://github.com/flekschas/jupyter-scatter" rel="nofollow">https://github.com/flekschas/jupyter-scatter</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Single-cell data visualization at ISMB BioVis 2023</title>
      <link>https://lekschas.de/blog/are-you-at-ismb2023-in-lyon-and-frequently-embed</link>
      <guid isPermaLink="true">https://lekschas.de/blog/are-you-at-ismb2023-in-lyon-and-frequently-embed</guid>
      <pubDate>Mon, 24 Jul 2023 12:00:00 GMT</pubDate>
      <description>Comparing two embedding visualizations can be challenging due to batch effects, stochasticity, and the sheer complexity of the plots. Spearheaded by Trevor Manz during his internship at Ozette, we…</description>
      <content:encoded><![CDATA[<p>Are you at ISMB in Lyon and frequently embed single-cell data for visualization? Comparing two embedding visualizations can be challenging due to batch effects, stochasticity, and the sheer complexity of the plots. Spearheaded by <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> during his internship at <a href="https://ozette.com" rel="nofollow">Ozette</a>, we developed a new visualization framework and Python tool to simplify and guide the comparison of embedding visualizations using computational metrics.</p> <p>➡️ <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a></p> <p>To learn more, come to Trevor Manz’s talk on Effective Comparison of Single-Cell Embedding Visualizations in the BioVis track on July 25 11:50am CEST. In his talk, Trevor will showcase several use cases of single-cell surface proteomics embeddings. And in case you can’t make it, Trevor will also present during the BioVis poster session (B-062) on July 25 at 6pm CEST.</p>]]></content:encoded>
    </item>
    <item>
      <title>It's great to be back the SciPy conference</title>
      <link>https://lekschas.de/blog/its-great-to-be-back-the-scipy-conference-and</link>
      <guid isPermaLink="true">https://lekschas.de/blog/its-great-to-be-back-the-scipy-conference-and</guid>
      <pubDate>Fri, 14 Jul 2023 12:00:00 GMT</pubDate>
      <description>Check out for the tutorial &amp; slides. In the tutorials we're showing example on how to use Jupyter Scatter to explore single-cell, image, text, geospatial, and genomic embedding data.</description>
      <content:encoded><![CDATA[<p>It’s great to be back the <a href="https://www.scipy2023.scipy.org/" rel="nofollow">SciPy conference</a> and having had the chance to present <a href="https://github.com/flekschas/jupyter-scatter/" rel="nofollow">Jupyter Scatter</a> – a Jupyter widget for rendering &amp; linking interactive scatter plots with millions of points.</p> <p>Check out <a href="https://github.com/flekschas/jupyter-scatter-tutorial" rel="nofollow">https://github.com/flekschas/jupyter-scatter-tutorial</a> for the tutorial &amp; slides. In the tutorials we’re showing example on how to use Jupyter Scatter to explore single-cell, image, text, geospatial, and genomic embedding data.</p> <p>Huge shout out to the absolutely amazing <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> for migrating jscatter to <a href="https://anywidget.dev" rel="nofollow">anywidget</a>, helping out with the tutorial, and setting up the cool genomics use case with the <a href="https://higlass.io/" rel="nofollow">HiGlass genome browser</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Workshop on high-dimensional data</title>
      <link>https://lekschas.de/blog/it-was-great-to-be-part-of-the-workshop-on-high</link>
      <guid isPermaLink="true">https://lekschas.de/blog/it-was-great-to-be-part-of-the-workshop-on-high</guid>
      <pubDate>Tue, 20 Jun 2023 12:00:00 GMT</pubDate>
      <description>Huge shoutout to Jen Rogers who organized a big part of the workshop. Looking forward to continuing the collaboration with everyone!</description>
      <content:encoded><![CDATA[<p>It was great to be part of the workshop on high-dimensional data visualization. Huge shoutout to <a href="https://jenrogers.dev" rel="nofollow">Jen Rogers</a> who organized a big part of the workshop. Looking forward to continuing the collaboration with everyone!</p> <p>Also, our fabulous intern from last year – <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> – was also at the workshop and shared his thoughts on comparative embedding visualization and the tool he developed: <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Comparative embedding visualization for single-cell data</title>
      <link>https://lekschas.de/blog/do-you-frequently-explore-single-cell-data-via</link>
      <guid isPermaLink="true">https://lekschas.de/blog/do-you-frequently-explore-single-cell-data-via</guid>
      <pubDate>Mon, 22 May 2023 12:00:00 GMT</pubDate>
      <description>Comparing multiple embeddings can be challenging due to batch effects, missing point correspondences, and the sheer complexity of of the data.</description>
      <content:encoded><![CDATA[<p>Do you frequently explore single-cell data via 2D embedding visualizations?</p> <p>Comparing multiple embeddings can be challenging due to batch effects, missing point correspondences, and the sheer complexity of of the data.</p> <p>I’m super excited for <a href="https://ozette.com" rel="nofollow">Ozette Technologies</a>’s first graduate research intern <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> to present his research work on addressing several of these challenges in comparative embedding visualization at Cyto’s “High Dimensional Cytometry” session today (Room 510B at 10:30am).</p> <p>➡️ <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a></p> <p>Following our work on annotation-transformation embedding approach (<a href="https://github.com/flekschas-ozette/ismb-biovis-2022" rel="nofollow">https://github.com/flekschas-ozette/ismb-biovis-2022</a>), Trevor developed graph-based metrics for comparing embeddings via shared point labels. The metrics quantify how much point labels are visually intermixed, how much the local neighborhood of labels differ between two embeddings, and how much the (cluster) size of labels change within their local neighborhoods between two embeddings.</p> <p>Moreover, all three metrics can be applied across label hierarchies and to <em>different</em> samples as long as the labels are shared between the embeddings.</p> <p>We developed a Python-based prototype for the Jupyter Lab/Notebook environment that you can find at <a href="https://github.com/OzetteTech/comparative-embedding-visualization" rel="nofollow">https://github.com/OzetteTech/comparative-embedding-visualization</a>. The API isn’t stable yet but feel free to give it a try! And let us know what you think. 🙏</p> <p>If you miss Trevor’s talk, feel free to drop by our booth (Number 539) to learn more about our ongoing work and Ozette Technologies new suite of ML-powered tools for analyzing and exploring high-dimensional single-cell data!</p>]]></content:encoded>
    </item>
    <item>
      <title>regl-scatterplot got published 🎉</title>
      <link>https://lekschas.de/blog/after-5-years-of-working-on-this-scatter-plot</link>
      <guid isPermaLink="true">https://lekschas.de/blog/after-5-years-of-working-on-this-scatter-plot</guid>
      <pubDate>Tue, 11 Apr 2023 12:00:00 GMT</pubDate>
      <description>Some new features that I added over the last year include fast point filtering, animated zooming to points, and lasso selection on long press. See for a demo video. (Pssst, if you code primarily in…</description>
      <content:encoded><![CDATA[<p>After 5 years of working on this scatter plot library called <a href="https://github.com/flekschas/regl-scatterplot" rel="nofollow">regl-scatterplot</a>, it got published in the <a href="https://joss.theoj.org/papers/10.21105/joss.05275" rel="nofollow">Journal of Open Source Software</a> 🎉🌈🦄💃👻🤘 Huge thanks to the reviewers and editors for their feedback!</p> <p>Some new features that I added over the last year include fast point filtering, animated zooming to points, and lasso selection on long press. See <a href="https://vis.social/@flekschas/110180857858665444" rel="nofollow">https://vis.social/@flekschas/110180857858665444</a> for a demo video. (Pssst, if you code primarily in Python, all those features also made it into the Jupyter widget called jupyter-scatter <a href="https://github.com/flekschas/jupyter-scatter/" rel="nofollow">https://github.com/flekschas/jupyter-scatter/</a>)</p> <p>But this is not the end, there are more exciting features in the pipeline that I hope to get implemented soon. Stay tuned!</p>]]></content:encoded>
    </item>
    <item>
      <title>ISMB 2023 conference talks are online</title>
      <link>https://lekschas.de/blog/in-case-you-missed-last-years-ismb-conference-i</link>
      <guid isPermaLink="true">https://lekschas.de/blog/in-case-you-missed-last-years-ismb-conference-i</guid>
      <pubDate>Thu, 16 Feb 2023 12:00:00 GMT</pubDate>
      <description>If you're working with #singlecell data, check out the talks from Evan Greene and myself on #clustering and #embedding #visualization.</description>
      <content:encoded><![CDATA[<p>In case you missed last years <a href="https://www.iscb.org/ismb2022/home" rel="nofollow">ISMB conference</a>, I just found out that the talks have been published on YouTube over the last month: <a href="https://www.youtube.com/@ISCBtv/videos" rel="nofollow">https://www.youtube.com/@ISCBtv/videos</a></p> <p>If you’re working with single-cell data, check out the talks from Evan Greene and myself on clustering and embedding #visualization.</p> <p>Evan presents a novel machine learning approach for unbiased discovery and annotation of cellular phenotypes in high-dimensional cytometry data that’s been foundational for <a href="https://ozette.com" rel="nofollow">Ozette Technologies</a>.</p> <p>🎥 <a href="https://www.youtube.com/watch?v=jrrvVnbda74" rel="nofollow">https://www.youtube.com/watch?v=jrrvVnbda74</a> Related paper: <a href="https://www.sciencedirect.com/science/article/pii/S2666389921002348" rel="nofollow">https://www.sciencedirect.com/science/article/pii/S2666389921002348</a> Related code: <a href="https://github.com/RGLab/FAUST" rel="nofollow">https://github.com/RGLab/FAUST</a></p> <p>I talked about a novel data transformations to create effective single-cell embedding visualizations that disentangle and align cell clusters across latent spaces. The transformations can be used with any dimensionality reduction methods (like PCA, t-SNE, UMAP, etc.)</p> <p>🎥 <a href="https://www.youtube.com/watch?v=BSGQZIiVwtY" rel="nofollow">https://www.youtube.com/watch?v=BSGQZIiVwtY</a> Related code: <a href="https://github.com/flekschas-ozette/ismb-biovis-2022" rel="nofollow">https://github.com/flekschas-ozette/ismb-biovis-2022</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Reflecting 2022 at Ozette</title>
      <link>https://lekschas.de/blog/reflecting-on-last-year-one-of-the-great-joys</link>
      <guid isPermaLink="true">https://lekschas.de/blog/reflecting-on-last-year-one-of-the-great-joys</guid>
      <pubDate>Thu, 05 Jan 2023 12:00:00 GMT</pubDate>
      <description>Trevor's research will help us surface insightful differences between single-cell embeddings. We'll share more details in the near future!</description>
      <content:encoded><![CDATA[<p>Reflecting on last year, one of the great joys was working with <a href="https://ozette.com" rel="nofollow">Ozette Technologies</a>’s first graduate research intern <a href="https://trevorma.nz/" rel="nofollow">Trevor Manz</a> on comparative embedding visualization methods. Trevor’s research will help us surface insightful differences between single-cell embeddings. We’ll share more details in the near future!</p> <p>Looking forward to more exciting research collaborations in 2023.</p>]]></content:encoded>
    </item>
    <item>
      <title>Looking for a graduate summer intern at Ozette</title>
      <link>https://lekschas.de/blog/are-you-a-phd-student-interested-in-helping</link>
      <guid isPermaLink="true">https://lekschas.de/blog/are-you-a-phd-student-interested-in-helping</guid>
      <pubDate>Tue, 29 Nov 2022 12:00:00 GMT</pubDate>
      <description>At Ozette Technologies, a biotech startup from Fred Hutch and AI2, we are looking for a graduate summer intern to research with us on the above-mentioned and related areas. If this sounds interesti…</description>
      <content:encoded><![CDATA[<p>Are you a PhD student interested in helping scientists better understand the human immune system through data visualization, human-centered ML/AI, and computational biology?</p> <p>At <a href="https://ozette.com" rel="nofollow">Ozette Technologies</a>, a biotech startup from Fred Hutch and AI2, we are looking for a graduate summer intern to research with us on the above-mentioned and related areas. If this sounds interesting to you, please feel free to reach out to me and apply at <a href="https://www.ozette.com/careers-apply/?jobid=4739131004#job-apply" rel="nofollow">https://www.ozette.com/careers-apply/?jobid=4739131004#job-apply</a></p>]]></content:encoded>
    </item>
    <item>
      <title>I received the EuroVis Best PhD Award 🙇‍♂️</title>
      <link>https://lekschas.de/blog/im-deeply-honored-to-receive-the-eurovis-best</link>
      <guid isPermaLink="true">https://lekschas.de/blog/im-deeply-honored-to-receive-the-eurovis-best</guid>
      <pubDate>Tue, 14 Jun 2022 12:00:00 GMT</pubDate>
      <description>Huuuge thanks to all awardees, the hard-working committee, all my wonderful collaborators (especially Benjamin Bach, Peter Kerpedjiev, Nezar Abdennur, PhD, Krzysztof Gajos, Spyridon Ampanavos, Eric…</description>
      <content:encoded><![CDATA[<p>I’m deeply honored to receive the <a href="https://www.eg.org/wp/eurographics-awards-programme/eurovis-phd-award/" rel="nofollow">EuroVis Best PhD Award</a> 🙇‍♂️ and sad I can’t be at EuroVis 2022 in person. Huuuge thanks to all awardees, the hard-working committee, all my wonderful collaborators (especially <a href="https://benjbach.github.io/" rel="nofollow">Benjamin Bach</a>, <a href="https://www.linkedin.com/in/peter-kerpedjiev/" rel="nofollow">Peter Kerpedjiev</a>, <a href="https://nvictus.me" rel="nofollow">Nezar Abdennur</a>, <a href="https://kgajos.seas.harvard.edu" rel="nofollow">Krzysztof Gajos</a>, <a href="https://www.linkedin.com/in/spyridon-ampanavos" rel="nofollow">Spyridon Ampanavos</a>, <a href="https://ericmjl.github.io" rel="nofollow">Eric Ma</a>, <a href="https://www.linkedin.com/in/brant-peterson-b390a51/" rel="nofollow">Brant Peterson</a> and many more) and, most of all, my absolutely fantastic advisor <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a> and co-advisor <a href="https://hidivelab.org/team/members/nils-gehlenborg/" rel="nofollow">Nils Gehlenborg</a> 🙏</p> <p>I had an incredibly inspiring and fun 4.5 years of researching “Scalable Visualization Tools for Pattern-Driven Data Exploration” in Hanspeter’s Visual Computing Group at Harvard University (Harvard John A. Paulson School of Engineering and Applied Sciences) that came to a beautiful closure at last month’s make-up commencement for my 2021 graduation. 🥳</p> <p>Thank you all!</p>]]></content:encoded>
    </item>
    <item>
      <title>How to give effective design feedback</title>
      <link>https://lekschas.de/blog/how-to-give-effective-design-feedback</link>
      <guid isPermaLink="true">https://lekschas.de/blog/how-to-give-effective-design-feedback</guid>
      <pubDate>Fri, 07 May 2021 12:00:00 GMT</pubDate>
      <description>Here is a blog post we wrote to summarize our recent work on enhancing design feedback:</description>
      <content:encoded><![CDATA[<p>How to give effective design feedback? Here is a blog post we wrote to summarize our recent work on enhancing design feedback:</p> <p>➡️ <a href="https://medium.com/harvard-hci/ask-me-or-tell-me-c01a19bb05b5" rel="nofollow">https://medium.com/harvard-hci/ask-me-or-tell-me-c01a19bb05b5</a></p> <p>In short: Asking an open-ended question first before stating the potentially negative or positive assessment results in better design revisions than just the assessment or just the question.</p> <p>Great work with <a href="https://www.linkedin.com/in/spyridon-ampanavos" rel="nofollow">Spyridon Ampanavos</a>, <a href="https://paoponder.com/" rel="nofollow">Pao Siangliulue</a>, <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a>, and <a href="https://kgajos.seas.harvard.edu" rel="nofollow">Krzysztof Gajos</a>!</p> <p>If you want to dive in deeper, below is our upcoming ACM CHI presentation and the paper. 📹 <a href="https://www.youtube.com/watch?v=qtZ1bYAfi1I" rel="nofollow">https://www.youtube.com/watch?v=qtZ1bYAfi1I</a> 📄 <a href="https://vcg.seas.harvard.edu/pubs/ask-or-tell-me" rel="nofollow">https://vcg.seas.harvard.edu/pubs/ask-or-tell-me</a></p> <p>PS: The awesome figure was created by the fabulous Pao Siangliulue</p>]]></content:encoded>
    </item>
    <item>
      <title>Preprint for 'Ask me or tell me' is out</title>
      <link>https://lekschas.de/blog/i-am-excited-to-share-a-preprint-for-our</link>
      <guid isPermaLink="true">https://lekschas.de/blog/i-am-excited-to-share-a-preprint-for-our</guid>
      <pubDate>Fri, 22 Jan 2021 12:00:00 GMT</pubDate>
      <description>Enhancing the Effectiveness of Crowdsourced Design Feedback&quot;! Great work with the fabulous Spyridon Ampanavos, Krzysztof Gajos, Pao Siangliulue, and Hanspeter Pfister</description>
      <content:encoded><![CDATA[<p>I am excited to share a preprint for our upcoming CHI ‘21 paper “Ask Me or Tell Me? Enhancing the Effectiveness of Crowdsourced Design Feedback”! Great work with the fabulous <a href="https://www.linkedin.com/in/spyridon-ampanavos" rel="nofollow">Spyridon Ampanavos</a>, <a href="https://paoponder.com/" rel="nofollow">Pao Siangliulue</a>, <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a>, and <a href="https://kgajos.seas.harvard.edu" rel="nofollow">Krzysztof Gajos</a>.</p> <p>➡️ <a href="http://arxiv.org/abs/2101.06143" rel="nofollow">http://arxiv.org/abs/2101.06143</a></p> <p>In short: Combine feedback statements with open-ended questions for better design revisions!</p> <p>tl/dr; We investigated the effectiveness of crowdsourced design feedback that is framed as statements and questions on graphic design revisions. We found that a combination of both, where questions are shown before statements, led to the best design revisions overall.</p> <p>There are two reasons why we think we saw these results: First, our results show that feedback framed as open-ended questions contains much less sentiment compared to the corresponding feedback statements. Having neutral sentiment is important because overly positive feedback does not promote significant changes in the design revision. On the other hand, negative feedback can be hurtful and make people ignore it. Moreover, questions can promote reflection and subsequently help us to focus on the design task, which can help to generate more ideas for the design revision.</p>]]></content:encoded>
    </item>
    <item>
      <title>Our paper on visual piling won a best paper honorable mention</title>
      <link>https://lekschas.de/blog/i-am-excited-to-share-our-forthcoming-paper-on</link>
      <guid isPermaLink="true">https://lekschas.de/blog/i-am-excited-to-share-our-forthcoming-paper-on</guid>
      <pubDate>Wed, 07 Oct 2020 12:00:00 GMT</pubDate>
      <description>Great collaboration with Xinyi Zhou, Wei Chen, Nils Gehlenborg, Benjamin Bach, and Hanspeter Pfister</description>
      <content:encoded><![CDATA[<p>I am excited to share our forthcoming paper on <a href="https://arxiv.org/abs/2005.00595" rel="nofollow">interactive visual piling for exploration and comparison of small multiples</a>, which won an <a href="https://virtual.ieeevis.org/year/2020/awards.html" rel="nofollow">IEEE Visualization (InfoVis) Best Paper Honorable Mention Award</a>. Great collaboration with <a href="https://www.linkedin.com/in/xinyi-zhou-1b6281213/" rel="nofollow">Xinyi Zhou</a>, <a href="http://www.cad.zju.edu.cn/home/chenwei" rel="nofollow">Wei Chen</a>, <a href="https://hidivelab.org/team/members/nils-gehlenborg/" rel="nofollow">Nils Gehlenborg</a>, <a href="https://benjbach.github.io/" rel="nofollow">Benjamin Bach</a>, and <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a></p> <p>Project page: <a href="https://piling.lekschas.de" rel="nofollow">https://piling.lekschas.de</a> Code: <a href="https://github.com/flekschas/piling.js" rel="nofollow">https://github.com/flekschas/piling.js</a> Demos: <a href="https://piling.js.org" rel="nofollow">https://piling.js.org</a> Publication: <a href="https://vcg.seas.harvard.edu/pubs/piling" rel="nofollow">https://vcg.seas.harvard.edu/pubs/piling</a></p>]]></content:encoded>
    </item>
    <item>
      <title>EuroVis paper on interactive visual pattern search in sequential data is accepted</title>
      <link>https://lekschas.de/blog/i-am-happy-to-share-our-forthcoming-eurovis</link>
      <guid isPermaLink="true">https://lekschas.de/blog/i-am-happy-to-share-our-forthcoming-eurovis</guid>
      <pubDate>Tue, 12 May 2020 12:00:00 GMT</pubDate>
      <description>Check out our video at for a quick introduction and visit for more details. Also, the code and data are freely and openly available at</description>
      <content:encoded><![CDATA[<p>I am happy to share our forthcoming EuroVis paper on <a href="https://pubmed.ncbi.nlm.nih.gov/34334852/" rel="nofollow">Interactive Visual Pattern Search in Sequential Data Using Unsupervised Deep Representation Learning</a>. 🎉 Great collaboration with <a href="https://www.linkedin.com/in/brant-peterson-b390a51/" rel="nofollow">Brant Peterson</a>, <a href="https://danielhaehn.com" rel="nofollow">Daniel Haehn</a>, <a href="https://ericmjl.github.io/" rel="nofollow">Eric Ma</a>, <a href="https://hidivelab.org/team/members/nils-gehlenborg/" rel="nofollow">Nils Gehlenborg</a>, and <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a> that started at Novartis Institutes for BioMedical Research (NIBR)</p> <p>Check out our video at <a href="https://youtu.be/FlzTdFUVE-M" rel="nofollow">https://youtu.be/FlzTdFUVE-M</a> for a quick introduction and visit <a href="http://peax.lekschas.de" rel="nofollow">http://peax.lekschas.de</a> for more details. Also, the code and data are freely and openly available at <a href="https://github.com/Novartis/peax" rel="nofollow">https://github.com/Novartis/peax</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>SciPy conference talk on HiGlass</title>
      <link>https://lekschas.de/blog/are-you-interested-in-visually-exploring</link>
      <guid isPermaLink="true">https://lekschas.de/blog/are-you-interested-in-visually-exploring</guid>
      <pubDate>Fri, 19 Jul 2019 12:00:00 GMT</pubDate>
      <description>Here's the recording of my joint #talk with @Nezar Abdennur, PhD from last week's absolutely amazing SciPy #conference We presented the HiGlass framework and how it can be used as a widget in Jupyt…</description>
      <content:encoded><![CDATA[<p>Are you interested in visually exploring, comparing, and sharing large quantitative datasets? Here’s the recording of my joint #talk with <a href="https://nvictus.me/" rel="nofollow">Nezar Abdennur</a> from last week’s absolutely amazing <a href="https://scipy2019.scipy.org/" rel="nofollow">SciPy conference</a> <a href="https://youtu.be/v62k4Ok1S8g" rel="nofollow">https://youtu.be/v62k4Ok1S8g</a> We presented the <a href="https://github.com/higlass/higlass" rel="nofollow">HiGlass framework</a> and how it can be used as a <a href="https://github.com/higlass/higlass-python" rel="nofollow">widget in Jupyter notebook or Lab</a></p>]]></content:encoded>
    </item>
    <item>
      <title>I am looking forward to presenting new work on epigenomic data</title>
      <link>https://lekschas.de/blog/i-am-looking-forward-to-presenting-new-work-on</link>
      <guid isPermaLink="true">https://lekschas.de/blog/i-am-looking-forward-to-presenting-new-work-on</guid>
      <pubDate>Wed, 13 Feb 2019 12:00:00 GMT</pubDate>
      <description>A fun project between the Visual Computing Group (at Harvard John A. Paulson School of Engineering and Applied Sciences) and the Scientific Data Analysis group (at Novartis Institutes for BioMedica…</description>
      <content:encoded><![CDATA[<p>I am looking forward to presenting new work (<a href="https://github.com/Novartis/peax/" rel="nofollow">https://github.com/Novartis/peax/</a>) on epigenomic data exploration using unsupervised deep representation learning for building visual pattern detectors interactively. A fun project between the <a href="https://vcg.seas.harvard.edu" rel="nofollow">Visual Computing Group</a> (at <a href="https://seas.harvard.edu" rel="nofollow">Harvard John A. Paulson School of Engineering and Applied Sciences</a>) and the Scientific Data Analysis group (at <a href="https://www.novartis.com/us-en/biomedical-research-organization-cambridge-massachusetts" rel="nofollow">Novartis Institutes for BioMedical Research</a> (NIBR)) with the fantastic <a href="https://www.linkedin.com/in/brant-peterson-b390a51/" rel="nofollow">Brant Peterson</a>, <a href="https://danielhaehn.com" rel="nofollow">Daniel Haehn</a>, <a href="https://ericmjl.github.io/" rel="nofollow">Eric Ma</a>, <a href="https://hidivelab.org/team/members/nils-gehlenborg/" rel="nofollow">Nils Gehlenborg</a>, and <a href="https://vcg.seas.harvard.edu/people" rel="nofollow">Hanspeter Pfister</a> #presenter #visualization #epigenomics</p>]]></content:encoded>
    </item>
  </channel>
</rss>
