matplotlib
官网,开源(GitHub,23K Star,8.4K Fork)可视化绘图库,
Seaborn
官网,开源(GitHub,14K Star,2.1K Fork)统计数据可视化库,
bokeh
官网,中文官网,开源(GitHub,20.4K Star,4.3K Fork)交互式数据可视化库。
PyEcharts
官网,开源(GitHub,15.8K Star,2.8K Fork)库,
Plotly
官网,交互式图表开源(GitHub,18.7K Star,2.8K Fork)库,适合快速生成浏览器里的交互式图表,用于数据分析和可视化。
既有Plotly Express这种高层API,也有graph_objects这种细粒度对象接口,能覆盖从简单柱状图到指标卡、地图和复杂dashboard组件的需求。官方文档。
特点
- 图形多样化:在线绘制多种图形,如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭日图、联合分布图、地图等
- 在线可编辑:提供在线编辑的平台,可将生成的图形保存到该平台,并进行分享
- 开源免费:所有资源都是开源免费的,用户可直接使用,还可直接和R、Python、MATLAB等无缝对接
- 图形动态化:生成图形全部是动态化;Plotly的绘图最好在Jupyter notebook中进行,能够很好地显示动态效果
- 交互强:缩放、悬停、图例筛选等交互默认可用
- 颜色绚丽:在使用Plotly绘制图形时,可进行图形颜色的设置,提供丰富颜色面板供选择
- 代码量少:尤其是Plotly的高级封装Plotly_Express,代码量非常少;一行代码就能实现多种功能且精美的图形
- 格式开放:Figure可转成JSON,方便存储、审查和前端复用
- 内置丰富数据集:内置7个不同类型的数据集,方便直接使用内置数据进行学习、使用
- 文档健全:官方提供丰富的文档资料和案例可免费学习,能够快速的上手
适合交互式报表、嵌入网页、HTML分享、Dash应用、业务指标页、需要悬停和图例筛选的图表。
不适合对图像文件像素级排版要求极高的论文图,或完全不能引入前端JS运行时的环境。
实战
基于pip安装:
pipinstallplotly pipinstallplotly_express示例:
importplotly.expressaspximportpandasaspdimportplotly.graph_objectsasgo# 内置GDP数据集gapminder=px.data.gapminder()# 小费tips=px.data.tips()# 鸢尾花iris=px.data.iris()wind=px.data.wind()election=px.data.election()carshare=px.data.carshare()stock=px.data.stock()df=pd.DataFrame({"month":["Jan","Feb","Mar"],"sales":[120,160,90]})fig=px.bar(df,x="month",y="sales",title="sales")print("traces:",len(fig.data))print("type:",fig.data[0].type)fig.show()感觉执行或渲染速度有点慢,自动打开浏览器新标签页,网址为http://127.0.0.1:14574,交互图如下:
更多示例:
# 散点图gap=px.data.gapminder().query("year == 2025")fig=px.scatter(gap,x="gdpPercap",y="lifeExp",color="continent",size="pop"# 点的大小,size_max=60# 点的最大值)fig.show()# 3D散点图df=px.data.iris()fig=px.scatter_3d(df,# 指定数据x='sepal_length',# 指定xyzy='sepal_width',z='petal_width',color='species')# 指定颜色fig.show()# 散点图fig=go.Figure(go.Scatter(x=[1,2,3],y=[4,6,5],mode="lines+markers"))fig.update_layout(template="plotly_white",hovermode="x unified")print("mode:",fig.data[0].mode)print("template set:",fig.layout.templateisnotNone)print("hovermode:",fig.layout.hovermode)# 示例2fig=go.Figure(go.Indicator(mode="number+delta",value=420,delta={"reference":380}))spec=fig.to_dict()print("trace type:",spec["data"][0]["type"])print("delta ref:",spec["data"][0]["delta"]["reference"])print("json ready:",bool(fig.to_json()))注意事项:
- 固定输入字段、数据量范围和缺失值策略
- 明确图表是静态导出、Notebook交互、桌面GUI、Web嵌入
- 在目标运行环境里做一次渲染或导出验证
Altair
项目主页,基于Vega-Lite声明式绘图开源(GitHub,10.4K Star,863 Fork)工具,用数据字段、mark类型和编码规则描述图表。适用于数据分析、报表原型、Notebook探索、前后端共享图表规格、需要可交互图表等场景。图表规格可以导出为JSON,前端也容易复用。
特点
- 声明式:关注字段和映射关系,而不是手动画布细节
- 交互方便:selection、condition等能力能快速做筛选和高亮
- 规格可导出:图表本质是Vega-Lite spec,适合保存、审查和前端复用
不足:处理超大数据集(几十万行以上)会有点吃力,做特别复杂的自定义图形也不如Matplotlib灵活。
不适合超大数据直接塞进前端spec、需要像素级手工排版的出版图,或高度定制的3D/动画图表。
实战
基于pip安装:pip install altair
入门示例:
importaltairasaltimportpandasaspd data=pd.DataFrame({'x':['A','B','C','D'],'y':[1,2,1,2]})alt.Chart(data).mark_bar().encode(x='x',y='y',)注意不能直接使用终端执行,需借助于Jupyter Notebook,效果如下:
右上角选项
更多示例:
importpandasaspdimportaltairasalt data=pd.DataFrame({"month":["Jan","Feb","Mar"],"sales":[120,160,90]})chart=alt.Chart(data).mark_bar().encode(x="month",y="sales")spec=chart.to_dict()print("mark:",spec["mark"]["type"])print("fields:",[spec["encoding"][k]["field"]forkin["x","y"]])data=pd.DataFrame({"team":["A","A","B","B"],"x":[1,2,1,2],"y":[3,5,2,7]})chart=alt.Chart(data).mark_line(point=True).encode(x="x",y="y",color="team")spec=chart.to_dict()print("color field:",spec["encoding"]["color"]["field"])print("rows:",len(spec["datasets"][next(iter(spec["datasets"]))]))source=pd.DataFrame({"category":["A","B","C","D"],"value":[28,55,43,91]})selector=alt.selection_point(fields=["category"])chart=alt.Chart(source).mark_bar().encode(x="category",y="value",color=alt.condition(selector,alt.value("#4c78a8"),alt.value("#d3d3d3")),).add_params(selector)spec=chart.to_dict()print("params:",spec["params"][0]["name"])print("condition test:","condition"inspec["encoding"]["color"])print("dataset rows:",len(spec["datasets"][next(iter(spec["datasets"]))]))注意事项:
- 控制数据量,必要时先聚合再画
- 固定字段名和类型,避免图表变化
- 导出spec后在目标前端或报告环境里做一次渲染检查
bqplot
Jupyter交互绘图开源(GitHub,3.7K Star,481 Fork)库,底层基于ipywidgets。思路:让scale、mark、axis、interaction都成为可联动的Widget对象,官方文档。
特点
- 组件化:scale、mark、axis分开建模,适合组合复杂Notebook图表
- 交互自然:BrushSelector等交互对象可直接挂到Figure上
- 贴近Jupyter:和ipywidgets协作良好,适合参数控件联动图表
适合Jupyter Notebook、教学演示、参数调试、快速可视化原型、交互式探索分析、需要控件联动的小型数据工具。
不适合脱离Notebook的纯服务端报表,或需要独立前端工程长期维护的大型可视化平台。
实战
基于pip安装:pip install bqplot
示例:
fromimportlib.metadataimportversionfrombqplotimportAxis,Bars,LinearScale,Lines,Figure,OrdinalScale,Scatterfrombqplot.interactsimportBrushSelector x_sc,y_sc=LinearScale(),LinearScale()line=Lines(x=[1,2,3],y=[4,6,5],scales={"x":x_sc,"y":y_sc})fig=Figure(marks=[line],title="sales")print("marks:",len(fig.marks))print("points:",len(line.x))x_sc,y_sc=OrdinalScale(),LinearScale()bars=Bars(x=["A","B","C"],y=[4,7,2],scales={"x":x_sc,"y":y_sc})fig=Figure(marks=[bars],axes=[Axis(scale=x_sc),Axis(scale=y_sc,orientation="vertical")])print("bar labels:",[str(x)forxinbars.x])print("axes:",len(fig.axes))x_sc,y_sc=LinearScale(),LinearScale()scatter=Scatter(x=[1,2,3,4],y=[2,5,3,6],scales={"x":x_sc,"y":y_sc})selector=BrushSelector(x_scale=x_sc,y_scale=y_sc)fig=Figure(marks=[scatter],interaction=selector)print("interaction:",type(fig.interaction).__name__)print("selected:",selector.selected)注意事项:
- 固定输入字段、数据量范围和缺失值策略。
- 明确图表是静态导出、Notebook交互、桌面GUI、Web嵌入
- 在目标运行环境里做一次渲染或导出验证。
plotext
在终端里画图表,参考Python生态下CLI/TUI工具:Rich、Textual、alive-progress、tabulate、plotext、yaspin、Scroll Art。
plotlet
开源(GitHub),主打定制自由,输出静态SVG,不支持交互功能(鼠标悬浮显示数据、缩放、点击等),链式语法。适合场景:基因组图谱、曼哈顿图、进化树。
实战
基于pip安装:pip install plotlet
基于源码安装
gitclone https://github.com/gitbamboo42/plotletcdplotlet pipinstall-e.示例:
importplotletaspt data={"x":[1,2,3,4],"y":[1,4,9,16]}c=pt.chart(data,title="测试",xlabel="X轴",ylabel="Y轴")c.line(x="x",y="y")