
前言: 在当今信息爆炸的时代,数据已成为决策的关键依据。然而,原始数据往往以复杂、庞大的表格或数字形式呈现,难以直接解读。数据可视化恰似一把钥匙,能将枯燥的数据转化为直观易懂的图表,帮助我们迅速洞察数据背后的规律与趋势。
目录
[Matplotlib 入门:新手也能轻松上手](#Matplotlib 入门:新手也能轻松上手)
[安装 Matplotlib](#安装 Matplotlib)
[导入 Matplotlib](#导入 Matplotlib)
Matplotlib 入门:新手也能轻松上手
嘿,朋友!你是不是刚接触 Python 数据可视化,觉得无从下手?别急,我最近也在鼓捣这个,今天咱们就一起唠唠 Matplotlib,这个超实用的绘图库,保准你看完就能画出像模像样的图表。
安装 Matplotlib
想用 Matplotlib,得先把它装上。打开命令提示符或者终端,敲入这行代码:
pip install matplotlib
然后等一会儿,它就装好了。就像你买了一支新画笔,准备开始画画。
导入 Matplotlib
装好了就得导入,这就好比你把画笔从笔袋里拿出来。在代码里加上这一行:
python
import matplotlib.pyplot as plt
plt
就是 Matplotlib 里一个很好用的模块,它有很多绘图的命令,方便我们随时调用。
解决中文显示问题:超过90%的新手都会遇到
刚开始用 Matplotlib,你可能会发现中文显示乱码。别慌,这有解决办法。根据你的操作系统,加上几行代码就行:
python
import matplotlib.pyplot as plt
import sys
if sys.platform == "win32": # Windows 系统
plt.rcParams['font.family'] = 'SimHei' # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 这行代码能让负号正常显示哦
elif sys.platform == 'darwin': # macOS 系统
plt.rcParams['font.family'] = 'Heiti TC' # 设置字体为黑体繁体
elif sys.platform == 'linux': # Linux 系统
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei' # 设置字体为文泉驿微米黑
这几行代码就像是告诉电脑:"嘿,我要在图表里用中文哦,你得帮我搞定显示问题。"电脑收到指令后,就会乖乖地让中文正常显示啦。
绘制折线图
先来画个简单的折线图。先看代码:
python
def draw_line_chart():
# 这是咱们要画的点的横坐标和纵坐标
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 创建一个画布
plt.figure(figsize=(6, 4)) # 设置画布大小
# 开始画折线啦
plt.plot(x, y,
color='b', # 设置线条颜色为蓝色
linestyle='-', # 设置线条样式为实线
linewidth=2, # 设置线条宽度为 2
marker='o', # 设置标记点样式为圆圈
markersize=6, # 设置标记点大小
alpha=0.7, # 设置线条透明度
label='y = x²') # 设置图例
# 给图表加个标题
plt.title('简单的折线图', fontsize=16)
# 给 X 轴和 Y 轴加标签
plt.xlabel('X 轴', fontsize=12)
plt.ylabel('Y 轴', fontsize=12)
# 给图表加网格线
plt.grid(True, linestyle='--', alpha=0.5)
# 添加图例
plt.legend()
# 最后,把画好的图显示出来
plt.show()
# 调用这个函数,开始画图吧
draw_line_chart()
这段代码就像是一个步骤指南,一步一步教你怎么做。先准备数据(x 和 y),然后创建画布,接着用 plot 函数把线画上去,再加标题、标签、网格线这些装饰,最后把画好的图展示出来。
绘制散点图
再试试画散点图。散点图就像是在纸上随便洒了一些彩色的小点点,每个点点代表一个数据。看代码:
python
def draw_scatter_chart():
# 这是咱们要画的点的横坐标和纵坐标
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [5, 3, 8, 6, 2, 7, 4, 9, 1, 10]
# 创建画布
plt.figure(figsize=(6, 4))
# 开始画散点啦
plt.scatter(x, y,
c='r', # 设置点的颜色为红色
marker='o', # 设置标记点样式为圆圈
s=100, # 设置点的大小
alpha=0.6, # 设置点的透明度
label='数据点') # 给这些点点起个名字,显示在图例里
# 给图表加标题
plt.title('简单的散点图', fontsize=16)
# 给 X 轴和 Y 轴加标签
plt.xlabel('X 轴', fontsize=12)
plt.ylabel('Y 轴', fontsize=12)
# 加网格线
plt.grid(True, linestyle='--', alpha=0.3)
# 添加图例
plt.legend()
# 显示图表
plt.show()
# 调用这个函数,开始画散点图吧
draw_scatter_chart()
这段代码跟折线图的代码有点像,不过这次咱们用 scatter 函数来画点点,而不是用 plot 函数画线线。
绘制柱状图
最后,咱们再试试画柱状图。柱状图就像是在纸上竖起一根根小柱子,每个柱子的高度代表一个数值。看代码:
python
def draw_bar_chart():
# 这是咱们要比较的类别和对应的数值
categories = ['类别 A', '类别 B', '类别 C', '类别 D', '类别 E']
values = [23, 45, 12, 36, 58]
# 创建画布
plt.figure(figsize=(6, 4))
# 开始画柱状图啦
plt.bar(categories, values,
color='skyblue', # 设置柱子颜色为天蓝色
width=0.6, # 设置柱子宽度
alpha=0.8, # 设置柱子透明度
edgecolor='black', # 设置柱子边框颜色
label='数值') # 给这些柱子起个名字,显示在图例里
# 给图表加标题
plt.title('简单的柱状图', fontsize=16)
# 给 X 轴和 Y 轴加标签
plt.xlabel('类别', fontsize=12)
plt.ylabel('数值', fontsize=12)
# 加网格线
plt.grid(axis='y', linestyle='--', alpha=0.5)
# 添加图例
plt.legend()
# 显示图表
plt.show()
# 调用这个函数,开始画柱状图吧
draw_bar_chart()
柱状图的代码也跟前面的差不多,不过这次咱们用 bar 函数来画柱子,是不是感觉很简单?
实战演练:电影数据可视化
好了,咱们已经学会了基本的图表绘制方法,现在来点实战的,用 Matplotlib 做一个电影数据可视化的小项目吧。咱们一步一步来,这次我不直接给你完整的代码,咱们一起动手写。
第一步:准备数据
从上一章节L网络爬虫基础.py 获取到 "moviesTop250.txt",每部电影占据四行,分别包含电影名称、上映时间、评分和评价人数。先别急着画图,得先把数据读进来。
python
import numpy as np
import matplotlib.pyplot as plt
import sys
# 定义一个结构化数组类型来存储电影信息
dtype = np.dtype([('名字', np.str_, 100), ('时间', np.str_, 20), ('评分', np.float32), ('评价人数', np.int32)])
# 初始化一个列表来存储解析后的电影数据
parsed_movies = []
# 读取电影信息文件
try:
with open("moviesTop250.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
for i in range(0, len(lines), 4):
if i + 3 < len(lines):
name_line = lines[i].strip()
year_line = lines[i + 1].strip()
rating_line = lines[i + 2].strip()
num_ratings_line = lines[i + 3].strip()
name = name_line.split("名字:")[1] if "名字:" in name_line else "无"
year = year_line.split("时间:")[1] if "时间:" in year_line else "无"
rating = float(rating_line.split("评分:")[1]) if "评分:" in rating_line else 0.0
num_ratings = int(num_ratings_line.split("评价人数:")[1]) if "评价人数:" in num_ratings_line else 0
parsed_movies.append((name, year, rating, num_ratings))
except IOError as e:
print(f"读取文件时出错:{e}")
exit()
# 将解析后的数据转换为结构化数组
movies_data = np.array(parsed_movies, dtype=dtype)
这段代码读取了包含电影信息的文本文件,并将数据存储在 NumPy 的结构化数组中。这是画图前的准备工作,就像做饭前要先准备好食材一样。
第二步:绘制评分最高的前5部电影
接下来,咱们先画一个柱状图,看看评分最高的前5部电影都是啥。在代码里加上这段:
python
# 创建一个画布
plt.figure(figsize=(6, 4))
# 对电影按评分进行排序,并取前5部
sorted_by_rating = np.argsort(movies_data['评分'])[::-1]
top_5_movies = movies_data[sorted_by_rating[:5]]
# 获取电影名称(确保名称不超出显示范围)
movie_names = [name[:15] + '...' if len(name) > 15 else name for name in top_5_movies['名字']]
# 绘制柱状图
plt.bar(movie_names, top_5_movies['评分'], color='skyblue')
# 添加标题和标签
plt.title('评分最高的前5部电影')
plt.xlabel('电影名称')
plt.ylabel('评分')
# 旋转标签以便更好地显示
plt.xticks(rotation=45, ha='right')
# 显示图表
plt.tight_layout()
plt.show()
这段代码先是把电影按评分排了个座次,然后挑出评分最高的前5部,最后用柱状图把它们的评分显示出来。是不是很直观?
第三步:绘制评价人数最多的前5部电影占比
光看评分还不够,咱们再画个饼图,看看评价人数最多的前5部电影各占多少比例。继续加代码:
python
# 创建一个画布
plt.figure(figsize=(6, 4))
# 对电影按评价人数进行排序,并取前5部
most_rated = np.argsort(movies_data['评价人数'])[::-1]
top_5_rated = movies_data[most_rated[:5]]
# 计算每部电影的评价人数占总评价人数的比例
total_ratings = sum(top_5_rated['评价人数'])
sizes_pie = [count / total_ratings * 100 for count in top_5_rated['评价人数']]
# 获取电影名称(确保名称不超出显示范围)
labels_pie = [name[:10] + '...' if len(name) > 10 else name for name in top_5_rated['名字']]
# 绘制饼图
plt.pie(sizes_pie, labels=labels_pie, autopct='%1.1f%%', startangle=90)
# 添加标题
plt.title('评价人数最多的前5部电影占比')
# 使饼图为正圆形
plt.axis('equal')
# 显示图表
plt.tight_layout()
plt.show()
这段代码把评价人数最多的前5部电影挑出来,计算了它们各自占总评价人数的比例,然后用饼图直观地展示出来。这样你一眼就能看出哪部电影最受欢迎。
第四步:把两个图放在一起
最后,咱们把这两个图放到一个画布上,这样看起来更整齐。把前面画图的代码改成这样:
python
# 创建一个包含1行2列的子图网格
fig, axs = plt.subplots(1, 2, figsize=(12, 6))
# 第一个子图:柱状图,显示评分最高的前5部电影
sorted_by_rating = np.argsort(movies_data['评分'])[::-1]
top_5_movies = movies_data[sorted_by_rating[:5]]
# 获取电影名称(确保名称不超出显示范围)
movie_names = [name[:15] + '...' if len(name) > 15 else name for name in top_5_movies['名字']]
axs[0].bar(movie_names, top_5_movies['评分'], color='skyblue')
axs[0].set_title('评分最高的前5部电影')
axs[0].set_xlabel('电影名称')
axs[0].set_ylabel('评分')
axs[0].set_xticks(range(len(movie_names)))
axs[0].set_xticklabels(movie_names, rotation=45, ha='right')
# 第二个子图:饼图,显示评价人数最多的前5部电影占比
most_rated = np.argsort(movies_data['评价人数'])[::-1]
top_5_rated = movies_data[most_rated[:5]]
total_ratings = sum(top_5_rated['评价人数'])
sizes_pie = [count / total_ratings * 100 for count in top_5_rated['评价人数']]
labels_pie = [name[:10] + '...' if len(name) > 10 else name for name in top_5_rated['名字']]
axs[1].pie(sizes_pie, labels=labels_pie, autopct='%1.1f%%', startangle=90)
axs[1].set_title('评价人数最多的前5部电影占比')
axs[1].axis('equal')
# 调整子图之间的间距
plt.tight_layout()
# 显示整个图表
plt.show()
这样,你就能在一个画布上同时看到评分最高的电影和评价人数最多的电影的分布情况啦。
总结
怎么样,朋友?是不是感觉画图也没那么难嘛?今天咱们一起用 Matplotlib 画了折线图、散点图和柱状图,还完成了电影数据的可视化实战项目。刚开始学的时候,可能有些参数和函数名称记不太清楚,但这没关系,多练几遍就熟悉啦。
如果你在画图过程中遇到啥问题,或者对某些参数不明白,别犹豫,赶紧问我或者跟其他小伙伴交流交流。咱们一起在数据可视化的奇妙世界里探险,说不定还能发现更多好玩的小工具和技巧呢!下次见啦,记得多练练哦!