Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat: make plotly-express dataframe agnostic via narwhals by FBruzzesi · Pull Request #4790 · plotly/plotly.py · GitHub
Skip to content

feat: make plotly-express dataframe agnostic via narwhals - #4790

Merged
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals
Nov 13, 2024
Merged

feat: make plotly-express dataframe agnostic via narwhals#4790
emilykl merged 131 commits into
plotly:masterfrom
FBruzzesi:plotly-with-narwhals

Conversation

@FBruzzesi

@FBruzzesiFBruzzesi commented Oct 9, 2024

Copy link
Copy Markdown
Contributor

Description

This PR migrates plotly-express module logic from pandas to narwhals. In this way, pandas is not a required dependency for plotly-express (or at least for its entirety - e.g. trendlines will still require pandas for now) and users coming with polars,
pyarrow or other eager dataframes supported in narwhals do not need to depend on pandas in the first place.

Closes#4749

Code PR

  • I have read through the contributing notes and understand the structure of the package. In particular, if my PR modifies code of plotly.graph_objects, my modifications concern the codegen files and not generated files.
  • I have added tests (if submitting a new feature or correcting a bug) or
    modified existing tests.
  • For a new feature, I have added documentation examples in an existing or
    new tutorial notebook (please see the doc checklist as well).
  • I have added a CHANGELOG entry if fixing/changing/adding anything substantial.
  • For a new feature or a change in behaviour, I have updated the relevant docstrings in the code to describe the feature or behaviour (please see the doc checklist as well).

Out of scope for the PR

  • No documentation change has been done so far
  • Adapt plotly data accordingly included in this PR
  • timeseries/trendlines

cc: @MarcoGorelli@LiamConnors

Comment threadpackages/python/plotly/_plotly_utils/basevalidators.py Outdated
Comment threadpackages/python/plotly/plotly/express/_core.py Outdated
@MarcoGorelli

Copy link
Copy Markdown
Contributor

But for pandas the order is consistent and seems to depend on the order of the data. Would it be possible to make it consistent for polars too. cc @emilykl

yup, addressed in the latest commit 👌

latest timings: https://www.kaggle.com/code/marcogorelli/visualise-timings?scriptVersionId=205986199

@emilyklemilykl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FBruzzesi@MarcoGorelli All looks good from our side. You can go ahead and merge when ready.

This was a massive effort, thank you very much for the contribution! 🚀

@FBruzzesi

FBruzzesi commented Nov 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Hey @emilykl thanks a ton! We really appreciated the collaborative effort! As mention on a few meetings, it led us to investigate deeper and improve narwhals codebase significantly as well, it has been such a win-win!

Regarding merging, the branch keeps going out of sync with master, and I will need another approval to merge it myself (and hopefully I need to time it correctly 😇) or you can approve and merge whenever you want. There are no other changes on this PR from our side 🚀

@emilykl
emilykl merged commit 5898816 into plotly:masterNov 13, 2024
@emilykl

Copy link
Copy Markdown
Contributor

@FBruzzesi@MarcoGorelli Merged! 🚀 🎉 💥

@FBruzzesi
FBruzzesi deleted the plotly-with-narwhals branch November 14, 2024 05:01
lsmoker added a commit to lsmoker/django-dashboards that referenced this pull request Sep 5, 2025
version 6.0.0 changed how dataframes are accessed (plotly/plotly.py#4790) which (I think) is breaking how django-dashboards reads dataframes
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

communitycommunity contributionfeaturesomething newP1needed for current cycle

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Explore using Narwhals in Plotly Express

7 participants

@FBruzzesi@ndrezn@gvwilson@LiamConnors@archmoj@MarcoGorelli@emilykl