一、Matplotlib 简介
今天我学习了Matplotlib ,它是 Python 的绘图库,能轻松将数据图形化,提供多样化输出格式,可绘制静态、动态、交互式图表,如散点图、柱状图等。
二、安装与导入
1. 安装
- 使用 pip 安装:
pip install matplotlib
- 使用 conda 安装:
conda install matplotlib
(可使用清华源:Simple Index)
2. 导入
python
运行
import matplotlib.pyplot as plt
三、基本绘图函数 plot ()
plot () 用于画图,可绘制点和线,语法格式为:plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
- x, y:点或线的节点,数据可以是列表或数组
- fmt:可选,定义基本格式(颜色、标记和线条样式)
-** kwargs:可选,设置指定属性,如标签、线的宽度等
1. 绘制线
python
运行
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([1, 8])
ypoints = np.array([3, 10])
plt.plot(xpoints, ypoints)
plt.show()
2. 绘制点
python
运行
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([1, 8])
ypoints = np.array([3, 10])
plt.plot(xpoints, ypoints, 'o^')
plt.show()
3. 绘制不规则线
python
运行
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([1, 2, 6, 8])
ypoints = np.array([3, 8, 1, 10])
plt.plot(xpoints, ypoints)
plt.show()
4. 不指定 x 轴
若不指定 x 轴上的点,x 会根据 y 的值设置为 0, 1, 2, 3..N-1
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([3, 8, 1, 10, 5, 7])
plt.plot(ypoints)
plt.show()
四、绘图标记
1. marker 参数
用于定义不同标记,部分标记及描述如下:
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
"." | 点 | "1" | 下三叉 |
"," | 像素点 | "2" | 上三叉 |
"o" | 实心圆 | "3" | 左三叉 |
"v" | 下三角 | "4" | 右三叉 |
"^" | 上三角 | "8" | 八角形 |
"<" | 左三角 | "s" | 正方形 |
">" | 右三角 | "p" | 五边形 |
示例:
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([1, 3, 4, 5, 8, 9, 6])
plt.plot(ypoints, marker='*')
plt.show()
2. fmt 参数
定义基本格式,格式为[marker][line][color]
- 标记字符:如 '.'(点标记)、'o'(实心圈标记)等
- 线型参数:'‐'(实线)、'‐‐'(破折线)、'‐.'(点划线)、':'(虚线)
- 颜色字符:'b'(蓝色)、'm'(洋红色)、'g'(绿色)等
示例:
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, 'o:r')
plt.show()
3. 标记大小与颜色设置
- markersize(ms):定义标记大小
- markerfacecolor(mfc):定义标记内部颜色
- markeredgecolor(mec):定义标记边框颜色
示例 1(设置标记大小):
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20)
plt.show()
示例 2(设置标记外边框颜色):
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mec='r')
plt.show()
示例 3(设置标记内部颜色):
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mfc='r')
plt.show()
五、绘图线
1. 线的类型
使用 linestyle 参数(简写为 ls)定义,部分类型及说明如下:
类型 | 简写 | 说明 |
---|---|---|
'solid' (默认) | '-' | 实线 |
'dotted' | ':' | 点虚线 |
'dashed' | '--' | 破折线 |
'dashdot' | '-.' | 点划线 |
'None' | '' 或 ' ' | 不画线 |
示例 1:
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, linestyle='dotted')
plt.show()
示例 2:
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, ls='-.')
plt.show()
2. 线的颜色
使用 color 参数(简写为 c)定义,部分颜色标记及描述如下:
颜色标记 | 描述 | 颜色标记 | 描述 |
---|---|---|---|
'r' | 红色 | 'c' | 青色 |
'g' | 绿色 | 'm' | 品红 |
'b' | 蓝色 | 'y' | 黄色 |
'k' | 黑色 | 'w' | 白色 |
示例:
python
运行
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, color='r')
plt.show()
3. 线的宽度
使用 linewidth 参数(简写为 lw)定义。
六、轴标签和标题
- xlabel ():设置 x 轴标签
- ylabel ():设置 y 轴标签
- title ():设置标题
示例 1(设置轴标签):
python
运行
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
示例 2(设置标题和轴标签):
python
运行
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.title("TITLE")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
七、网格线
grid () 用于设置图表中的网格线,语法格式:matplotlib.pyplot.grid(b=None, which='major', axis='both', )
- b:可选,设置布尔值,true 显示网格线,false 不显示
- which:可选,可选值有 'major'、'minor' 和 'both',默认 'major'
- axis:可选,设置显示网格线的方向,'both'、'x' 或 'y'
-** kwargs:可选,设置网格样式,如 color、linestyle、linewidth 等
示例 1:
python
运行
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("TITLE")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid()
plt.show()
示例 2(设置 x 轴方向网格线):
python
运行
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("TITLE")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid(axis='x')
plt.show()
示例 3(设置网格样式):
python
运行
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("TITLE")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid(color='r', linestyle='-', linewidth=0.5)
plt.show()
八、绘制多图
subplot () 用于绘制多个子图,语法:subplot(nrows, ncols, index)
,其中 nrows 为行数,ncols 为列数,index 为索引。
示例:
python
运行
import matplotlib.pyplot as plt
import numpy as np
# plot 1:
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
plt.subplot(1, 2, 1)
plt.plot(xpoints, ypoints)
plt.title("plot 1")
# plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.subplot(1, 2, 2)
plt.plot(x, y)
plt.title("plot 2")
plt.suptitle("TITLE")
plt.show()
九、散点图
scatter () 用于绘制散点图。
1. 基本散点图
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
plt.scatter(x, y)
plt.show()
2. 设置图标大小
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
sizes = np.array([20, 50, 100, 200, 500, 1000, 60, 90])
plt.scatter(x, y, s=sizes)
plt.show()
3. 自定义点的颜色
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
colors = np.array(["red", "green", "black", "orange", "purple", "beige", "cyan", "magenta"])
plt.scatter(x, y, c=colors)
plt.show()
4. 设置两组散点图
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array([5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6])
y = np.array([99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86])
plt.scatter(x, y, color='hotpink')
x = np.array([2, 2, 8, 1, 15, 8, 12, 9, 7, 3, 11, 4, 7, 14, 12])
y = np.array([100, 105, 84, 105, 90, 99, 90, 95, 94, 100, 79, 112, 91, 80, 85])
plt.scatter(x, y, color='#88c999')
plt.show()
十、柱形图
1. 基本柱形图(bar ())
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y)
plt.show()
2. 设置柱形图颜色
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, color="#4CAF50")
plt.show()
3. 自定义各个柱形的颜色
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, color=["#4CAF50", "red", "hotpink", "#556B2F"])
plt.show()
4. 设置柱形图宽度
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, width=0.1)
plt.show()
5. 垂直方向柱形图(barh ())
python
运行
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["a", "b", "c", "d"])
y = np.array([12, 22, 6, 18])
plt.barh(x, y)
plt.show()
十一、饼图
pie () 用于绘制饼图。
示例:
python
运行
import matplotlib.pyplot as plt
import numpy as np
y = np.array([35, 25, 25, 15])
plt.pie(y,
labels=['A', 'B', 'C', 'D'], # 设置饼图标签
colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
explode=(0, 0.2, 0, 0), # 第二部分突出显示
autopct='%.2f%%' # 格式化输出百分比
)
plt.title("TITLE")
plt.show()
十二、直方图
使用 hist () 方法绘制直方图,格式:matplotlib.pyplot.hist(x, bins=None, color=None, label=None, **kwargs)
- x:要绘制直方图的数据
- bins:可选,直方图的箱数,默认为 10
- color:可选,直方图的颜色
- label:可选,直方图的标签
1. 基本直方图
python
运行
import matplotlib.pyplot as plt
import numpy as np
# 生成一组随机数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, color='skyblue', alpha=0.8)
# 设置图表属性
plt.title('RUNOOB hist() Test')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 显示图表
plt.show()
2. 多组数据直方图
python
运行
import matplotlib.pyplot as plt
import numpy as np
# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(-2, 1, 1000)
# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')
# 设置图表属性
plt.title('RUNOOB hist() TEST')
plt.xlabel('Value')
plt.ylabel('
我还运用今天的指示表完成了几个练习
- 在同一张图中分别绘制正弦图和余弦图。
- 《python 数据分析实战》在亚马逊、当当网、中国图书网、京东和天猫的最低价格分别为 39.5、39.9、45.4、38.9、33.34,使用水平柱形图显示这些数据。
- 五年级三班的同学中,喜欢篮球的同学占 20%,喜欢乒乓球的同学占 30%,喜欢羽毛球的同学占 20%,喜欢足球的同学占 18%,喜欢排球的同学占 12%,根据这些数据绘制饼图。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib# 设置matplotlib的字体,确保负号和中文可以正确显示
matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号
matplotlib.rcParams['font.family'] = 'SimHei' # 使用黑体
matplotlib.rcParams['font.size'] = 12 # 设置字体大小# 创建数据点
x = np.linspace(0, 4 * np.pi, 100) # 生成从0到4π的100个等间距的数据点
y_sin = np.sin(x) # 计算正弦值
y_cos = np.cos(x) # 计算余弦值
# 绘制正弦图和余弦图
plt.plot(x, y_sin, label='sin(x)') # 绘制正弦图,设置标签
plt.plot(x, y_cos, label='cos(x)') # 绘制余弦图,设置标签
# 添加图例
plt.legend()
# 显示图形
plt.show()
y = np.array([20, 30, 18, 12, 20]) # 设置饼图的占比
plt.pie(y, labels=['篮球', '乒乓球', '足球', '排球', '羽毛球'], autopct='%.2f%%') # 百分比形式输出
plt.title("球类运动")
plt.show()
# 创建数据点
x = np.array(["亚马逊", "当当网", "中国图书网", "京东", "天猫"]) # 创建一个包含网站名称的数组
y = np.array([39.5, 39.9, 45.4, 38.9, 33.34]) # 创建一个包含相应数据的数组
# 绘制水平柱状图
plt.barh(x, y, height=0.5) # 使用barh函数绘制水平柱状图,height参数设置柱状图的高度
# 添加标题
plt.title("python数据分析实战") # 使用title函数添加图表标题
# 显示图形
plt.show() # 使用show函数显示图形
在使用 matplotlib 时我还遇到了一个问题,遇到图形不显示或只弹出空白窗口的问题,通常与绘图后端设置有关。我使用的解决方法:
添加阻塞模式显示
在 plt.show() 前添加 plt.ion() 开启交互模式,或者尝试在 plt.show() 后添加阻塞语句:
python
运行
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([1,8])
ypoints = np.array([3,10])
plt.plot(xpoints, ypoints)
plt.show(block=True) # 强制阻塞模式,确保窗口保持显示