Day 50:【99天精通Python】数据可视化 Matplotlib 基础 - 绘图入门
前言
欢迎来到第50天!
“一图胜千言”。在数据分析中,无论你的数据处理得多完美,如果不能用直观的图表展示出来,老板和客户是看不懂的。
Matplotlib是 Python 最基础、最强大的绘图库。它是许多高级可视化库(如 Seaborn, Pandas Plot)的底层。虽然它的默认样式稍微有点"理工男审美"(朴素),但只要稍加配置,它也能画出出版级的高质量图表。
本节内容:
- Matplotlib 画图逻辑 (Figure, Axes)
- 绘制折线图 (Line Plot)
- 绘制散点图 (Scatter Plot)
- 绘制饼图 (Pie Chart)
- 设置标题、标签、图例、网格
- 保存图片
一、画图的逻辑:画布与坐标系
很多初学者容易被plt.plot和ax.plot搞晕。我们先理清概念:
- Figure (画布):整个图片的底板。
- Axes (坐标系):画布上的一块区域,我们在这里画图(包含 x轴、y轴、标题等)。一张画布可以有多个坐标系(子图)。
importmatplotlib.pyplotaspltimportnumpyasnp# 1. 创建画布 (宽8英寸,高6英寸)fig=plt.figure(figsize=(8,6))# 2. 创建坐标系 (111 表示 1行1列的第1个子图)ax=fig.add_subplot(111)# 3. 画图x=[1,2,3,4]y=[10,20,15,30]ax.plot(x,y)# 4. 显示plt.show()简便写法:如果只有一张图,可以直接用
plt.plot(),它会自动创建 Figure 和 Axes。
二、折线图 (Line Plot)
折线图最适合展示趋势(如股票走势、气温变化)。
x=np.linspace(0,10,100)y=np.sin(x)plt.figure(figsize=(10,5))# plot(x, y, 格式字符串, label=...)# 'r--': 红色(red) 虚线(dashed)plt.plot(x,y,'r--',label='Sin Wave')# 再画一条 cos 曲线plt.plot(x,np.cos(x),'b-',label='Cos Wave')# 设置细节plt.title("Sin & Cos Function")plt.xlabel("Time (s)")plt.ylabel("Value")plt.legend()# 显示图例 (label)plt.grid(True)# 显示网格plt.show()三、散点图 (Scatter Plot)
散点图用于观察两个变量之间的关系(如身高与体重、房价与面积)。
# 生成 50 个随机点x=np.random.rand(50)y=np.random.rand(50)colors=np.random.rand(50)# 随机颜色sizes=np.random.rand(50)*100# 随机大小plt.scatter(x,y,c=colors,s=sizes,alpha=0.5)# alpha 透明度plt.title("Random Scatter")plt.show()四、饼图 (Pie Chart)
饼图用于展示占比。
labels=['Python','Java','C++','Go']sizes=[45,30,15,10]explode=(0.1,0,0,0)# 突出显示第一块 (Python)plt.pie(sizes,labels=labels,explode=explode,autopct='%1.1f%%',# 显示百分比shadow=True,startangle=90)plt.axis('equal')# 保证饼图是圆的,不是扁的plt.title("Programming Language Share")plt.show()五、中文显示问题 (复习)
Matplotlib 默认不支持中文,需要手动设置字体。
# Windowsplt.rcParams['font.sans-serif']=['SimHei']# Mac# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题plt.plot([1,2,3],[10,20,30])plt.title("中文标题测试")plt.show()六、多子图 (Subplots)
在一张画布上画多张图。
x=np.linspace(0,10,100)# 创建 2行1列 的布局fig,axes=plt.subplots(2,1,figsize=(8,8))# 第1张图 (axes[0])axes[0].plot(x,np.sin(x),'r')axes[0].set_title("Sin")# 第2张图 (axes[1])axes[1].plot(x,np.cos(x),'b')axes[1].set_title("Cos")plt.tight_layout()# 自动调整间距,防止重叠plt.show()七、保存图片
plt.plot(x,y)# dpi: 分辨率 (dots per inch),越高越清晰plt.savefig("my_plot.png",dpi=300)八、实战练习:股票走势图
模拟一支股票 10 天的收盘价,绘制折线图,并标出最高点。
days=range(1,11)prices=[10,12,11,14,13,16,18,15,19,22]plt.figure(figsize=(10,6))plt.plot(days,prices,marker='o',linestyle='-',color='g')# 标注最高点max_price=max(prices)max_day=days[prices.index(max_price)]# annotate(文本, xy=目标点, xytext=文字位置, arrowprops=箭头样式)plt.annotate(f'Peak:{max_price}',xy=(max_day,max_price),xytext=(max_day-2,max_price+2),arrowprops=dict(facecolor='red',shrink=0.05))plt.title("Stock Price Trend")plt.xlabel("Day")plt.ylabel("Price ($)")plt.grid(True)plt.show()九、小结
关键要点:
- 简单图用
plt.xxx,复杂多子图用fig, ax = plt.subplots()。 - 记住常用的图表类型:趋势看折线,占比看饼图,关系看散点,对比看柱状。
- 遇到中文乱码别慌,设置
font.sans-serif。
十、课后作业
- 成绩分布图:随机生成 100 个 0-100 的学生成绩,绘制直方图 (Histogram)查看分数分布情况(提示:
plt.hist)。 - 双轴图:在同一张图上,左边 Y 轴显示"销售额"(柱状图),右边 Y 轴显示"增长率"(折线图)。(提示:
ax.twinx())。 - 函数绘制:绘制y=x2y = x^2y=x2和y=x3y = x^3y=x3的图像,设置不同的颜色和线型,并添加图例。
下节预告
Day 51:数据可视化 Seaborn 进阶- Matplotlib 写起来代码太多?Seaborn 基于 Matplotlib,能用更少的代码画出更漂亮、更统计学专业的图表(如热力图、箱线图)。
系列导航:
- 上一篇:Day 49 - Pandas进阶
- 下一篇:Day 51 - 数据可视化Seaborn进阶(待更新)