小沐:戈戈,最近老师让我们做数据分析展示,我对着电脑发了半天愁,不知道该用啥工具好。
戈戈:哈哈,这是个好问题!Python里图表库可多了去了,从简单的柱状图到炫酷的交互式图表都能搞定。
小沐:可是太多了,我都不知道该学哪个。每个都要学吗?感觉时间不够用啊。
戈戈:别贪多!我给你介绍最主流的5个库,学会它们应付学生作业和项目展示足够了。
小沐:太好了!戈戈你快给我讲讲,我拿小本本记下来~

在数据分析和可视化领域,Python凭借其丰富的图表库生态占据重要地位。无论是学术研究、商业报表还是个人项目,选择合适的可视化工具都能让数据"说话"。本文将详细介绍Python生态中最流行的五大图表库,从安装到实战,手把手教你快速上手。
Matplotlib是Python最基础、最强大的二维绘图库,几乎所有其他可视化库都是基于它构建的。它提供了类似MATLAB的绘图接口,支持几乎所有类型的静态图表,从简单的折线图到复杂的三维曲面都不在话下。
pip install matplotlib numpyimport matplotlib.pyplot as pltimport numpy as np# 设置样式plt.style.use('seaborn-v0_8-whitegrid')# 准备数据x = np.linspace(0, 2 * np.pi, 100)# 创建图形fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 左图:渐变色填充曲线axes[0].fill_between(x, np.sin(x), alpha=0.3, color='#3498db')axes[0].plot(x, np.sin(x), color='#2980b9', linewidth=2)axes[0].set_title('Sine Wave', fontsize=14, fontweight='bold')axes[0].set_xlabel('X', fontsize=11)axes[0].set_ylabel('Y', fontsize=11)# 右图:双曲线对比axes[1].fill_between(x, np.sin(x), alpha=0.2, color='#e74c3c')axes[1].fill_between(x, np.cos(x), alpha=0.2, color='#3498db')axes[1].plot(x, np.sin(x), color='#e74c3c', linewidth=2, label='sin(x)')axes[1].plot(x, np.cos(x), color='#3498db', linewidth=2, label='cos(x)')axes[1].set_title('Sine vs Cosine', fontsize=14, fontweight='bold')axes[1].set_xlabel('X', fontsize=11)axes[1].legend(loc='upper right')plt.tight_layout()plt.savefig('matplotlib_demo.png', dpi=150, bbox_inches='tight')plt.show()print("图表已保存为 matplotlib_demo.png")
代码运行结果如下:

作为Python可视化的奠基之作,Matplotlib的优势在于高度灵活和可控性强。缺点是代码相对冗长,交互性较差。如果你需要快速出图,它仍然是首选工具。
Seaborn构建在Matplotlib之上,专门为统计图表设计。它的默认配色和样式更加美观,特别适合数据探索和统计分析场景。内置的回归分析、分布图、热力图等功能让数据科学家爱不释手。
pip install seaborn pandasimport seaborn as snsimport pandas as pdimport matplotlib.pyplot as pltimport numpy as np# 设置样式sns.set_style("whitegrid")sns.set_palette("husl")# 创建示例数据np.random.seed(42)data = pd.DataFrame({'group': np.random.choice(['A', 'B', 'C'], 200),'value': np.random.randn(200) * 10 + 50,'category': np.random.choice(['X', 'Y', 'Z'], 200)})# 创建图表fig, axes = plt.subplots(1, 2, figsize=(14, 6))# 1. Strip Plotsns.stripplot(x='group', y='value', data=data, ax=axes[0], alpha=0.6)axes[0].set_title('Strip Plot - Data Distribution', fontsize=12)# 2. Heatmapcorrelation_data = data.groupby(['group', 'category']).mean().unstack()sns.heatmap(correlation_data, annot=True, fmt='.1f', cmap='coolwarm', ax=axes[1])axes[1].set_title('Heatmap - Data Correlation', fontsize=12)plt.tight_layout()plt.savefig('seaborn_demo.png', dpi=150, bbox_inches='tight')plt.show()print("统计图表已保存为 seaborn_demo.png")
代码运行结果如下:

Seaborn让统计图表变得简单美观,特别适合数据探索阶段使用。它的缺点是自定义程度不如Matplotlib,且依赖Matplotlib。
Plotly是新一代交互式可视化库,支持Python、R、JavaScript等多种语言。它生成的图表可以悬停查看数据、缩放、拖拽,甚至制作动画效果。Web端展示效果极佳,是数据仪表盘的理想选择。
pip install plotly pandasimport plotly.express as pximport plotly.graph_objects as goimport pandas as pdimport numpy as np# 创建示例数据np.random.seed(42)df = pd.DataFrame({'日期': pd.date_range('2024-01-01', periods=100),'销售额': np.cumsum(np.random.randn(100) * 1000 + 5000),'产品类别': np.random.choice(['电子产品', '服装', '食品', '图书'], 100),'满意度': np.random.randint(60, 100, 100)})# 1. 交互式折线图fig1 = px.line(df, x='日期', y='销售额', color='产品类别',title='2024年销售额趋势(悬停查看详情)',markers=True)fig1.update_layout(hovermode='x unified')# 2. 动态散点图fig2 = px.scatter(df, x='销售额', y='满意度', color='产品类别',size='满意度', hover_data=['日期'],title='销售额与满意度关系(气泡大小表示满意度)')fig2.update_traces(marker=dict(line=dict(width=1, color='DarkSlateGrey')))# 3. 组合图表fig3 = go.Figure()fig3.add_trace(go.Scatter(x=df['日期'], y=df['销售额'],mode='lines+markers', name='销售额'))fig3.add_trace(go.Bar(x=df['日期'][:30], y=df['满意度'][:30],name='满意度', yaxis='y2'))fig3.update_layout(title='销售与满意度双轴图',yaxis=dict(title='销售额'),yaxis2=dict(title='满意度', overlaying='y', side='right'),hovermode='x unified')# 保存为HTML文件(可交互)fig1.write_html('plotly_line.html')fig2.write_html('plotly_scatter.html')fig3.write_html('plotly_combined.html')# 也可显示在notebook中fig1.show()fig2.show()fig3.show()print("交互式图表已保存为HTML文件,可在浏览器中打开")
代码运行结果如下:

Plotly的交互性是最大亮点,特别适合需要用户交互的数据展示场景。生成的HTML文件可以嵌入网页或分享给他人。缺点是文件体积较大,静态导出不如静态库方便。
Pyecharts是ECharts的Python绑定,ECharts是百度开源的强大JavaScript图表库。Pyecharts完美继承了ECharts的优美设计和丰富图表类型,中文文档完善,是中国开发者最熟悉的交互式图表工具之一。
pip install pyechartsfrom pyecharts import options as optsfrom pyecharts.charts import Bar, Line, Pie, Scatter, WordCloudfrom pyecharts.globals import ThemeTypeimport random# 1. 柱状图 - 中国城市GDP排名cities = ['北京', '上海', '深圳', '广州', '重庆', '成都', '杭州', '武汉']gdp = [40200, 43200, 30600, 28200, 27800, 19900, 18100, 17700]bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(cities).add_yaxis("GDP(亿元)", gdp, itemstyle_opts=opts.ItemStyleOpts(color="#5470C6")).set_global_opts(title_opts=opts.TitleOpts(title="2024年中国城市GDP排名", subtitle="数据来源:虚构"),toolbox_opts=opts.ToolboxOpts(is_show=True),datazoom_opts=opts.DataZoomOpts(),))# 2. 折线图 - 股票走势模拟dates = [f"2024-01-{i:02d}" for i in range(1, 31)]prices = [100 + random.randint(-50, 80) for _ in range(30)]prices = [min(max(p, 80), 200) for p in prices] # 限制范围line = (Line(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC)).add_xaxis(dates).add_yaxis("股价(元)",prices,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最高"),opts.MarkPointItem(type_="min", name="最低"),]),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=150, name="预警线")]),).set_global_opts(title_opts=opts.TitleOpts(title="股票价格走势图"),tooltip_opts=opts.TooltipOpts(trigger="axis"),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),))# 3. 饼图 - 用户年龄段分布age_groups = ['18-25岁', '26-35岁', '36-45岁', '46-55岁', '55岁以上']ages_count = [25, 40, 20, 10, 5]pie = (Pie(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION)).add("",[list(z) for z in zip(age_groups, ages_count)],radius=["30%", "70%"],label_opts=opts.LabelOpts(formatter="{b}: {c}%"),).set_global_opts(title_opts=opts.TitleOpts(title="用户年龄段分布"),legend_opts=opts.LegendOpts(orient="vertical", pos_left="left"),))# 4. 词云图 - 热门关键词words = [("Python", 1000),("数据分析", 800),("可视化", 650),("机器学习", 600),("人工智能", 550),("深度学习", 500),("大数据", 450),("Web开发", 400),("爬虫", 350),("自动化", 300),]wordcloud = (WordCloud(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS)).add("", words, word_size_range=[20, 100], shape="cardioid").set_global_opts(title_opts=opts.TitleOpts(title="技术热门关键词")))# 保存为HTML文件bar.render("pyecharts_bar.html")line.render("pyecharts_line.html")pie.render("pyecharts_pie.html")wordcloud.render("pyecharts_wordcloud.html")print("Pyecharts图表已保存为HTML文件")# 在Jupyter中直接显示# bar.render_notebook()# line.render_notebook()# pie.render_notebook()# wordcloud.render_notebook()
代码运行结果如下:



Pyecharts的中文支持非常好,图表风格现代美观,国内用户使用起来非常顺手。丰富的图表类型和交互功能让它成为制作数据大屏的首选工具。
Altair是基于Vega-Lite的声明式可视化库,它的设计理念是"告诉图表你要什么,而不是怎么做"。这种简洁的API设计让代码更加清晰易读,特别适合快速原型开发和数据探索。
pip install altair pandasimport altair as altimport pandas as pdimport numpy as np# 创建示例数据np.random.seed(42)df = pd.DataFrame({'品牌': np.random.choice(['苹果', '华为', '小米', 'OPPO', 'vivo'], 500),'价格': np.random.randint(1000, 8000, 500),'销量': np.random.randint(10, 1000, 500),'评分': np.random.uniform(3.0, 5.0, 500),'类型': np.random.choice(['手机', '平板', '耳机'], 500)})# 1. 散点图 - 价格与销量关系chart1 = alt.Chart(df).mark_circle(size=60).encode(x='价格',y='销量',color='品牌',tooltip=['品牌', '价格', '销量', '评分']).properties(title='手机价格与销量关系',width=500,height=300).interactive()# 2. 柱状图 - 各品牌平均评分chart2 = alt.Chart(df).mark_bar().encode(x='品牌',y='mean(评分)',color='品牌',tooltip=['品牌', 'mean(评分)']).properties(title='各品牌平均评分',width=400,height=300)# 3. 盒须图 - 不同类型产品的价格分布chart3 = alt.Chart(df).mark_boxplot().encode(x='类型',y='价格',color='类型').properties(title='不同类型产品价格分布',width=400,height=300)# 4. 多图表组合combined = alt.hconcat(chart2,alt.vconcat(chart1, chart3)).properties(title='手机市场数据分析仪表盘')# 保存为HTML文件chart1.save('altair_scatter.html')chart2.save('altair_bar.html')combined.save('altair_dashboard.html')# 在Jupyter中显示# chart1# chart2# combinedprint("Altair图表已保存为HTML文件")print(f"数据样本:\n{df.head()}")
代码运行结果如下:

Altair的声明式API非常优雅,代码可读性极高。它会自动处理比例尺、图例等细节,让你专注于数据本身。不过自定义灵活性稍差,不适合需要高度定制的场景。
| Matplotlib | |||
| Seaborn | |||
| Plotly | |||
| Pyecharts | |||
| Altair |
小沐:戈戈,你介绍的这几个库太实用了,我的期末展示肯定没问题了!
戈戈:那是必须的!图表选对了,数据表达就成功了一半。加油,期待你做出漂亮的可视化作品!

如果您觉得这些文字有一点点用处,请给作者点个赞或关个注;╮( ̄▽ ̄)╭
如果您有技术问题探讨,评论处留言。//(ㄒoㄒ)//
谢谢各位童鞋们啦( ´ ▽ ` )ノ ( ´ ▽ `` )っ!
更多精彩文章详见:
CSDN博客:爱看书的小沐