Python生态绘图类库:Folium、PlotNine、LeafMap、PyGal、CartoPy、floWeaver

发布时间:2026/8/6 0:12:11
Python生态绘图类库:Folium、PlotNine、LeafMap、PyGal、CartoPy、floWeaver 继Python生态绘图类库Plotly、Altair、bqplot、plotlet之后本文继续汇总Python生态下特定领域下的绘图类库。Folium项目主页地图画图工具开源GitHub7.4K Star2.3K Fork类库基于Leaflet.js可在Jupyter Notebook里画出可缩放、可拖拽、带标记点的交互式地图。适用场景场景说明数据可视化报告在Jupyter里展示地理数据分布门店/网点分布图批量打点直观看到覆盖范围路线规划展示把GPS轨迹画出来热力图分析如人口密度、事故高发区实战基于pip安装pip install folium示例importfolium# 创建地图定位到北京mfolium.Map(location[39.9042,116.4074],zoom_start12)# 加标记点folium.Marker([39.9042,116.4074],popup天安门,iconfolium.Icon(colorred,iconinfo-sign)).add_to(m)# 保存HTML文件m.save(map.html)# 在Jupyter里直接显示m批量打点importfoliumfromfolium.pluginsimportHeatMapimportpandasaspd# 门店数据storespd.DataFrame({name:[店A,店B,店C],lat:[39.90,39.92,39.88],lng:[116.40,116.42,116.38]})mfolium.Map(location[39.90,116.40],zoom_start13)for_,rowinstores.iterrows():folium.Marker([row[lat],row[lng]],popuprow[name]).add_to(m)# 用经纬度数据生成热力图heat_data[[row[lat],row[lng]]for_,rowinstores.iterrows()]HeatMap(heat_data).add_to(m)m效果图画区域、画路径# 画折线folium.PolyLine(locations[(39.90,116.40),(39.92,116.42),(39.88,116.38)],colorblue,weight5).add_to(m)# 画圆如覆盖范围folium.Circle(location[39.90,116.40],radius1000,# 米colorred,fillTrue).add_to(m)展示效果PlotNine官网图形语法绘图开源GitHub4.8K Star254 Fork库把ggplot2风格的Grammar of Graphics带到Python强调数据、映射、几何对象、坐标和分面等概念比先画线再调样式的过程更声明式官方文档。适合统计探索、分组对比、教学材料、希望用一致语法组织复杂统计图、从R或ggplot2迁移来的团队以及需要统一图形语法的分析脚本。不适合极复杂的交互式Web图表或需要直接操控Matplotlib底层每个Artist的精细场景。特点语法清晰用aes、geom、facet、coord组合图表表达意图很明确适合统计图分面、颜色映射、几何层叠很自然承接PandasDataFrame字段直接进入映射分析脚本里衔接顺。实战基于pip安装pip install plotnine示例importpandasaspdfromplotnineimportaes,coord_flip,facet_wrap,geom_point,geom_col,ggplot,stat_smooth,theme_xkcd,theme_tufte,theme_minimalfromplotnine.dataimportmtcars(ggplot(mtcars,aes(wt,mpg,colorfactor(gear)))# 调用mtcars数据集以车重wt与每加仑行驶英里数mpg为坐标颜色受gear影响geom_point())绘制效果图(ggplot(mtcars,aes(wt,mpg,colorfactor(gear)))geom_point()stat_smooth(methodlm)# 绘制线性拟合曲线)效果图需要等十几秒钟(ggplot(mtcars,aes(wt,mpg,colorfactor(gear)))geom_point()stat_smooth(methodlm)facet_wrap(gear)# 按gear进行分组以多面展示数据)效果图(ggplot(mtcars,aes(wt,mpg,colorfactor(gear)))geom_point()stat_smooth(methodlm)facet_wrap(gear)theme_xkcd()# 绘制手绘风格主题# theme_tufte() # Tufte 风格主题# theme_minimal() # 系统默认# theme_bw() # 系统默认)可能会输出字体不存在渲染没有什么较大影响findfont: Font family xkcd not found. findfont: Font family Humor Sans not found.不想看到警告信息添加两行代码importlogging logging.getLogger(matplotlib.font_manager).setLevel(logging.ERROR)渲染效果也可从xkcd-font官网下载xkcd.ttf字体文件。更多示例dfpd.DataFrame({x:[1,2,3],y:[2,5,3]})pggplot(df,aes(x,y))geom_point()figp.draw(showFalse)print(layers:,len(p.layers))print(axes:,len(fig.axes))dfpd.DataFrame({team:[A,B,C],score:[7,4,9]})pggplot(df,aes(team,score))geom_col(fill#4c78a8)coord_flip()figp.draw(showFalse)print(layers:,len(p.layers))print(coord:,type(p.coordinates).__name__)print(axes:,len(fig.axes))dfpd.DataFrame({x:[1,2,1,2],y:[3,5,2,7],team:[A,A,B,B]})pggplot(df,aes(x,y,colorteam))geom_point(size3)facet_wrap(team)figp.draw(showFalse)print(facets:,type(p.facet).__name__)print(panels:,len(fig.axes))解读把不同统计视角拆成geom和facet比在一段imperative代码里不断改axes更容易维护。注意事项固定输入字段、数据量范围和缺失值策略明确图表是静态导出、Notebook交互、桌面GUI还是Web嵌入在目标运行环境里做一次渲染或导出验证LeafMap官网基于folium开源GitHub3.8K Star469 Fork零代码地理数据分析与交互式绘图包。能力超多后端随意切换可切换到folium、ipyleaflet、kepler.gl、pydeck、bokeh等不同后端根据场景选最顺手的工具交互式绘图工具内置图形界面很多操作如加载数据、画图不用写代码在Jupyter里点点鼠标就能完成分析能力强大集成WhiteboxTools分析工具库可直接在地图上进行水文分析、地形分析、LiDAR数据处理等对新手和专家都友好初学者能快速上手出图专业用户也能用它处理复杂的空间数据和分析任务实战基于pip安装pip install leafmap示例PyGal官网SVG 图表生成开源GitHub2.8K Star419 Fork。创建图表对象、设置标签、添加series、渲染为SVG。相比大型交互式可视化框架更适合在文档、邮件图表、静态页面和报告里产出可缩放矢量图、需要SVG文件的自动化脚本以及需要轻量、可嵌入、无需复杂前端依赖时。适合在构建流程里生成、缓存、嵌入而不是依赖运行时再画。不适合高度复杂的交互式分析平台或需要海量数据点实时重绘的科学计算界面。特点SVG输出图表天然可缩放适合文档和静态页面API简洁Bar、Line、Radar等图表对象直接添加数据即可依赖轻不用完整前端框架也能生成可用图表资产实战基于pip安装pip install pygal示例importpygal chartpygal.Bar()chart.titlesaleschart.x_labels[Jan,Feb,Mar]chart.add(sales,[120,160,90])svgchart.render()print(series:,len(chart.raw_series))print(svg bytes:,len(svg))chartpygal.Line(interpolatecubic)chart.add(A,[1,3,2,5])chart.add(B,[2,2,4,3])names[meta[title]fordata,metainchart.raw_series]svgchart.render()print(series names:,names)print(series count:,len(chart.raw_series))print(svg bytes:,len(svg))chartpygal.Radar()chart.x_labels[speed,quality,cost]chart.add(plan A,[8,7,5])chart.add(plan B,[6,9,7])svgchart.render(is_unicodeTrue)print(radar labels:,list(chart.x_labels))print(has svg:,svg.lstrip().startswith(?xml))CartoPy面向地图绘制和地理投影的开源GitHub1.6K Star396 Fork库常和Matplotlib、NumPy、GeoPandas一起使用。把经纬度坐标、投影坐标、地图要素和坐标轴变换放进同一套模型里管理。适合气象图、海洋航线、遥感辅助图、区域统计地图等场景下的可视化官方文档。特点投影清楚CRS对象负责坐标系统和变换适合在图上混合经纬度、墨卡托等坐标要素可控Natural Earth要素可按类别和比例尺组织便于控制海岸线、陆地等素材生态兼容和Matplotlib配合紧密适合把科学计算结果落到地图视图里不适合只想快速在网页里拖动地图的场景这类需求通常Leaflet、Mapbox或Folium更合适。实战基于pip安装pip install cartopy示例importcartopy.crsasccrsimportcartopy.featureascfeatureimportnumpyasnp srcccrs.PlateCarree()dstccrs.Mercator()ptsdst.transform_points(src,np.array([0,120]),np.array([0,30]))fmtlambdarow:[float(round(v,2))forvinrow[:2]]print(threshold:,round(src.threshold,3))print(points:,pts.shape)print(x0/y0:,fmt(pts[0]))print(x1/y1:,fmt(pts[1]))landcfeature.NaturalEarthFeature(physical,land,110m)print(feature:,land.name)print(category:,land.category)print(scale:,land.scale)解读把经纬度点转换到Web/墨卡托类坐标验证数据坐标能进入目标投影定义Natural Earth地图要素后续可交给Matplotlib轴对象渲染注意事项固定Python、核心库和系统依赖版本避免环境漂移用小样本覆盖输入边界、空值、异常值和坐标/数组维度把外部服务、投影数据或编译依赖写进部署文档floWeaver开源GitHub464 Star89 Fork流数据可视化可将类似于“源-目标-数值”这种表单数据变成比例精准、配色高级的桑基图官方文档。组件floWeaver负责逻辑层ipysankeywidget负责在Jupyter里渲染图表用ProcessGroup定义聚合类别用Waypoint标记节点SankeyDefinition负责布局Weave负责数据映射。实战基于pip安装pip install floweaver示例fromfloweaverimportSankeyDefinition,WeavefromfloweaverimportProcessGroup,Waypointimportpandasaspd group_electProcessGroup(电子产品)group_homeProcessGroup(家居生活)group_clothProcessGroup(服饰美妆)w_electWaypoint(group_elect,title电子)w_homeWaypoint(group_home,title家居)w_clothWaypoint(group_cloth,title服装)sankey_defSankeyDefinition(flows[(w_elect,w_home),(w_elect,w_cloth),(w_home,w_cloth)],waypoints[w_elect,w_home,w_cloth])datapd.DataFrame({source:[电子,电子,家居],target:[家居,服装,服装],value:[100,50,30]})weaveWeave(sankey_def,data,link_columns[source,target,value])weave.to_widget()sankey_def.flows[(w_elect,w_home),(w_home,w_cloth)]weave_newWeave(sankey_def,data,link_columns[source,target,value])weave_new.to_widget()TODO上述代码在2.0.1版本跑不通。优势在于它把“流”的语法抽象得非常干净几行代码就能出专业级桑基图且配色省心。不足高度绑定ipysankeywidget只能用于Jupyter Notebook或Lab没法直接导出PNG或用在Django网站上。