完全指南:从 Plotly Express 密度等高线到 Graph Objects 高级定制)
数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载二维直方图等高线图2D Histogram Contour又称密度等高线图 density contour plot是 Plotly.py 中处理大规模散点数据、化解点重叠over-plotting问题的核心统计可视化方案。本文将基于仓库文档 doc/python/2d-histogram-contour.md系统讲解如何用 Plotly Express 的px.density_contour()快速绘制密度等高线以及如何用go.Histogram2dContour以 Graph Objects 方式实现颜色刻度、样式定制与子图布局并结合仓库源码深入剖析分箱、聚合函数与等高线着色等底层实现。什么是二维直方图等高线图二维直方图等高线图是一维直方图在二维平面上的推广它先把由x、y坐标指定的散点集合划分到二维分箱bins中再对每个箱子应用count计数或sum求和当提供z时等聚合函数从而得到用于计算等高线的数值场。最终呈现的效果与等高线图相似但其数值来源是数据点的密度统计而非显式给定的网格值。这种可视化以及与之相关的 2D Histogram 密度热力图通常用于处理 over-plotting 问题当数据量很大、以散点图直接展示时大量点会相互重叠、掩盖真实分布模式而把点聚合成密度场后分布的峰值与形状一目了然。使用 Plotly Express 绘制密度等高线Plotly Express 是 Plotly 的高层级、易用接口可处理多种形式的数据长格式、宽格式、numpy 数组等其px.density_contour()函数专门用于生成密度等高线图。最简示例以下代码使用 Plotly Express 内置的 tips小费数据集绘制消费金额total_bill与小费tip的联合密度import plotly.express as px df px.data.tips() fig px.density_contour(df, xtotal_bill, ytip) fig.show()从源码看density_contour()定义于 plotly/express/_chart_types.py它内部调用make_figure并以go.Histogram2dContour作为构造器同时注入一组默认 trace 配置trace_patchdict( contoursdict(coloringnone), histfunchistfunc, histnormhistnorm, nbinsxnbinsx, nbinsynbinsy, xbingroupx, ybingroupy, )其中contoursdict(coloringnone)意味着 Plotly Express 默认只画等高线而不填充颜色xbingroupx、ybingroupy则让主图与后续的边际图marginal plots共享同一分箱方案保证密度场与边际直方图严格对齐。添加边际分布图Marginal Plots可以通过marginal_x/marginal_y参数在图的边缘展示两个变量各自的一维分布。这里使用边际直方图histogram其他可选值为violin、box和rugimport plotly.express as px df px.data.tips() fig px.density_contour(df, xtotal_bill, ytip, marginal_xhistogram, marginal_yhistogram) fig.show()边际图由 plotly/express/_core.py 中的配套逻辑实现它会根据marginal_x的值决定是否追加go.Histogramtrace 并分配独立的x2/y2轴域还会在marginal_x为histogram时隐藏主图的网格线避免视觉干扰见 plotly/express/_core.py。仓库测试 tests/test_optional/test_px/test_marginals.py 专门覆盖了各类边际图的组合行为。分面与小面颜色密度等高线同样支持分面facet与离散颜色discrete color。下面示例按sex分面、按smoker着色import plotly.express as px df px.data.tips() fig px.density_contour(df, xtotal_bill, ytip, facet_colsex, colorsmoker) fig.show()注意当同时使用facet_row与marginal_x时Plotly Express 会依据 plotly/express/_core.py 的逻辑自动禁用边际图以避免布局冲突因此在设计图表时需要取舍分面与边际图。连续着色与等高线标注Plotly Express 密度等高线支持连续颜色colorscales。由于默认着色方式是none要得到填充式密度图需要在生成后通过update_traces把contours_coloring改为fill并可选地开启等高线数值标签import plotly.express as px df px.data.tips() fig px.density_contour(df, xtotal_bill, ytip) fig.update_traces(contours_coloringfill, contours_showlabels True) fig.show()使用count之外的其他聚合函数通过传入z值并指定histfunc密度等高线可以执行基本的聚合运算。下面示例使用鸢尾花Iris数据集展示以花瓣长度petal_length和花瓣宽度petal_width分组后、sepal_length的平均值分布import plotly.express as px df px.data.iris() fig px.density_contour(df, xpetal_length, ypetal_width, zsepal_length, histfuncavg) fig.show()histfunc的取值与底层go.Histogram2dContour.histfunc属性一致在 plotly/graph_objs/_histogram2dcontour.py 中声明为枚举[count, sum, avg, min, max]——分别表示对每个分箱内的数据点数计数、求和、取平均、取最小或取最大。z的值正是这些函数的输入。使用 Graph Objects 构建二维直方图等高线不借助 Plotly Express 时可以使用plotly.graph_objects中的go.Histogram2dContour类直接构建这类图形。该类的完整属性定义见 plotly/graph_objs/_histogram2dcontour.py。基础二维直方图等高线最基础的用法只需传入x和y两组随机点import plotly.graph_objects as go import numpy as np np.random.seed(1) x np.random.uniform(-1, 1, size500) y np.random.uniform(-1, 1, size500) fig go.Figure(go.Histogram2dContour( x x, y y )) fig.show()默认情况下数据会先做分箱再计算等高线。分箱策略可通过nbinsx/nbinsy分箱数量若显式给出xbins.size则被忽略、xbins/ybins由start、end、size定义的分箱区间以及兼容旧版的autobinx/autobiny来调节后两者属于兼容性开关源码注释明确指出现代用法中只需设置xbins/ybins即可autobinx/autobiny仅为接受历史遗留写法而保留见 plotly/graph_objs/_histogram2dcontour.py。自定义颜色刻度Colorscale通过colorscale属性可以选择内置颜色刻度如Blues、Jet等并用reversescaleTrue反转色序import plotly.graph_objects as go import numpy as np x np.random.uniform(-1, 1, size500) y np.random.uniform(-1, 1, size500) fig go.Figure(go.Histogram2dContour( x x, y y, colorscale Blues )) fig.show()颜色映射的数值域由zmin/zmax控制两者需成对设置单位与z相同zmid则可在保持zmin/zmax不动的情况下移动颜色域的中间点。reversescaleTrue时zmin对应色带末尾的颜色、zmax对应色带开头的颜色见 plotly/graph_objs/_histogram2dcontour.py。密度场的数据归一化方式还可由histnorm控制其枚举取值为原始计数、percent、probability、density、probability density分别对应百分比、概率、密度总面积等于样本数与概率密度总面积等于 1等不同语义见 plotly/graph_objs/_histogram2dcontour.py。完整样式定制下面示例在Jet色带上叠加等高线标注并自定义 hover 标签样式import plotly.graph_objects as go import numpy as np x np.random.uniform(-1, 1, size500) y np.random.uniform(-1, 1, size500) fig go.Figure(go.Histogram2dContour( x x, y y, colorscale Jet, contours dict( showlabels True, labelfont dict( family Raleway, color white ) ), hoverlabel dict( bgcolor white, bordercolor black, font dict( family Raleway, color black ) ) )) fig.show()其中contours子对象的完整属性在 plotly/graph_objs/histogram2dcontour/_contours.py 中定义核心参数包括coloring等高线着色方式枚举取值为fill在每两条等高线之间均匀填充、heatmap等高线间应用热力图渐变填充、lines只给等高线本身着色与none不着色Plotly Express 默认值showlabels是否显示每条等高线上的数值标签labelfont等高线标签的字体设置family、size、color未指定部分继承layout.fontstart/end等高线起始与终止层级值要求end严格大于startsize等高线层级之间的间距showlines是否显示等高线本身仅在coloring为fill时生效。带边际直方图的子图布局Graph Objects 方式可以自由组合多个 trace。下面示例把Histogram2dContour与原始散点、两个方向的边际直方图组合进同一画布主图占据x/y轴域[0, 0.85]两个边际直方图分别挂在x2/y2轴域[0.85, 1]import plotly.graph_objects as go import numpy as np t np.linspace(-1, 1.2, 2000) x (t**3) (0.3 * np.random.randn(2000)) y (t**6) (0.3 * np.random.randn(2000)) fig go.Figure() fig.add_trace(go.Histogram2dContour( x x, y y, colorscale Blues, reversescale True, xaxis x, yaxis y )) fig.add_trace(go.Scatter( x x, y y, xaxis x, yaxis y, mode markers, marker dict( color rgba(0,0,0,0.3), size 3 ) )) fig.add_trace(go.Histogram( y y, xaxis x2, marker dict( color rgba(0,0,0,1) ) )) fig.add_trace(go.Histogram( x x, yaxis y2, marker dict( color rgba(0,0,0,1) ) )) fig.update_layout( autosize False, xaxis dict( zeroline False, domain [0,0.85], showgrid False ), yaxis dict( zeroline False, domain [0,0.85], showgrid False ), xaxis2 dict( zeroline False, domain [0.85,1], showgrid False ), yaxis2 dict( zeroline False, domain [0.85,1], showgrid False ), height 600, width 600, bargap 0, hovermode closest, showlegend False ) fig.show()这段示例同样展示了 Graph Objects 方式的灵活性domain控制各轴在画布上的占用比例hovermodeclosest使鼠标悬停时优先高亮最近的数据点bargap0让边际直方图条与条之间无缝衔接。整个布局与 Plotly Express 自动生成的边际图在结构上一致——这也印证了 plotly/express/_core.py 中把Histogram2dContour与Histogram2d一并作为支持边际图处理的笛卡尔 trace 的实现。使用要点小结数据量大的场景优先选密度等高线相比散点图它能把数万个点的分布压缩为清晰的密度场避免 over-plotting 掩盖模式快速出图用px.density_contour一行代码完成分箱与等高线绘制并天然支持分面、离散颜色、边际图和聚合函数count/sum/avg/min/max精细控制用go.Histogram2dContour可自定义colorscale、zmin/zmax/zmid、nbinsx/nbinsy与xbins/ybins以及contours的coloring、start/end/size、showlabels等全部细节聚合与归一化语义要分清histfunc决定每个分箱的取值方式histnorm决定密度场的归一化方式两者配合可得到计数、均值、概率密度等不同语义的分布图边际图共享分箱Plotly Express 通过xbingroup/ybingroup让主图与边际直方图使用同一分箱方案保证一维与二维分布严格一致。参考资料本文主体来源doc/python/2d-histogram-contour.mdPlotly Express 实现plotly/express/_chart_types.pydensity_contour及make_docstring参数文档底层 trace 属性plotly/graph_objs/_histogram2dcontour.pyhistfunc、histnorm、nbinsx/nbinsy、xbins/ybins、colorscale、zmin/zmax/zmid等等高线子对象plotly/graph_objs/histogram2dcontour/_contours.pycoloring、start/end/size、showlabels、labelfont、showlines边际图与分箱联动逻辑plotly/express/_core.pymarginal_x处理、xbingroup/ybingroup注入相关测试tests/test_optional/test_px/test_marginals.py、tests/test_optional/test_px/test_px.py赞分享数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载相关推荐终极Android徽章解决方案BadgeView让MaterialDesign风格通知轻松实现终极Android徽章解决方案BadgeView让MaterialDesign风格通知轻松实现 BadgeView是一款专为Android开发者打造的轻量级徽数据可视化数据分析Plotly.py 直方图Histogram完全指南从 Plotly Express 到 go.Histogram 的统计可视化实战Plotly.py 直方图Histogram完全指南从 Plotly Express 到 go.Histogram 的统计可视化实战 本篇技术指南以仓库文数据可视化数据分析Plotly.py 散点图与折线图完全指南从 Plotly Express 到 go.Scatter 的实战详解Plotly.py 散点图与折线图完全指南从 Plotly Express 到 go.Scatter 的实战详解 导读 散点图Scatter Plot与折数据可视化数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考