
繼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網站上。