1.使用subplot绘制单子图
import matplotlib.pyplot as plt
# 画布被规划为3×2 的矩阵区域 , 之后在索引为6 的区域中绘制子图
ax_one = plt.subplot(326)
ax_one.plot([1, 2, 3, 4, 5])
# 画布被规划为3×1 的矩阵区域 , 之后在索引为2 的区域中绘制子图
ax_two = plt.subplot(312)
ax_two.plot([1, 2, 3, 4, 5])
plt.show()
2.实例:某工厂产品A与产品B去年的销售额分析
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘font.sans-serif’] = [“SimHei”]
x = [x for x in range(1, 13)]
y1 = [20, 28, 23, 16, 29, 36, 39, 33, 31, 19, 21, 25]
y2 = [17, 22, 39, 26, 35, 23, 25, 27, 29, 38, 28, 20]
labels = [‘1 月’, ‘2 月’, ‘3 月’, ‘4 月’, ‘5 月’, ‘6 月’, ‘7月’, ‘8 月’, ‘9 月’, ‘10 月’, ‘11 月’, ‘12 月’]
# 将画布规划成等分布局的2×1的矩阵区域 , 之后在索引为1的区域中绘制子图
ax1 = plt.subplot(211)
ax1.plot(x, y1, ‘m–o’, lw=2, ms=5, label=‘产品A’)
ax1.plot(x, y2, ‘g–o’, lw=2, ms=5, label=‘产品B’)
ax1.set_title(“产品A 与产品B的销售额”, fontsize=11)
ax1.set_ylim(10, 45)
ax1.set_ylabel(‘销售额(亿元)’)
ax1.set_xlabel(‘月份’)
for xy1 in zip(x, y1):
ax1.annotate("%s" % xy1[1], xy=xy1, xytext=(-5, 5), textcoords=‘offset points’)
for xy2 in zip(x, y2):
ax1.annotate("%s" % xy2[1], xy=xy2, xytext=(-5, 5), textcoords=‘offset points’)
ax1.legend()
# 将画布规划成等分布局的2×2的矩阵区域 , 之后在索引为3的区域中绘制子图
ax2 = plt.subplot(223)
ax2.pie(y1, radius=1, wedgeprops={‘width’:0.5}, labels=labels, autopct=’%3.1f%%’, pctdistance=0.75)
ax2.set_title(‘产品A的销售额 ‘)
# 将画布规划成等分布局的2×2的矩阵区域 , 之后在索引为4的区域中绘制子图
ax3 = plt.subplot(224)
ax3.pie(y2, radius=1, wedgeprops={‘width’:0.5}, labels=labels,autopct=’%3.1f%%’, pctdistance=0.75)
ax3.set_title('产品B的销售额 ')
# 调整子图之间的距离
plt.tight_layout()
plt.show()
3.使用subplots绘制多子图
import matplotlib.pyplot as plt
# 将画布划分为2×2的等分区域
fig, ax_arr = plt.subplots(2, 2)
# 获取 ax_arr 数组第1行第0列的元素 , 也就是第3个区域
ax_thr = ax_arr[1, 0]
ax_thr.plot([1, 2, 3, 4, 5])
plt.show()
4.实例:部分国家养猫人群比例与养狗人群比例分析
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘font.sans-serif’] = [“SimHei”]
# 添加无指向型注释文本
def autolabel(ax, rects):
#在每个矩形条的上方附加一个文本标签, 以显示其高度
for rect in rects:
width = rect.get_width() # 获取每个矩形条的高度
ax.text(width + 3, rect.get_y() , s=’{}’.format(width), ha=‘center’, va=‘bottom’)
y = np.arange(12)
x1 = np.array([19, 33, 28, 29, 14, 24, 57, 6, 26, 15, 27, 39])
x2 = np.array([25, 33, 58, 39, 15, 64, 29, 23, 22, 11, 27, 50])
labels = np.array([‘中国’, ‘加拿大’, ‘巴西’, ‘澳大利亚’, ‘日本’, ‘墨西哥’, ‘俄罗斯’, ‘韩国’, ‘瑞士’, ‘土耳其’, ‘英国’, ‘美国’])
# 将画布规划为1×2的矩阵区域 , 依次在每个区域中绘制子图
fig, (ax1, ax2) = plt.subplots(1, 2)
barh1_rects = ax1.barh(y, x1, height=0.5, tick_label=labels, color=’#FFA500’)
ax1.set_xlabel(‘人群比例(%)’)
ax1.set_title(‘部分国家养猫人群的比例’)
ax1.set_xlim(0, x1.max() + 10)
autolabel(ax1, barh1_rects)
barh2_rects = ax2.barh(y, x2, height=0.5, tick_label=labels, color=’#20B2AA’)
ax2.set_xlabel(‘人群比例(%)’)
ax2.set_title(‘部分国家养狗人群的比例’)
ax2.set_xlim(0, x2.max() + 10)
autolabel(ax2, barh2_rects)
# 调整子图之间的距离
plt.tight_layout()
plt.show()
5.使用subplot2grid()绘制自定义区域的子图
import matplotlib.pyplot as plt
# 画布被规划成2×3的矩阵区域 , 之后在第0行第2列的区域中绘制子图
ax1 = plt.subplot2grid((2, 3), (0, 2))
ax1.plot([1, 2, 3, 4, 5])
# 画布被规划成2×3的矩阵区域 , 之后在第1行第1~2列的区域中绘制子图
ax2 = plt.subplot2grid((2, 3), (1, 1), colspan=2)
ax2.plot([1, 2, 3, 4, 5])
plt.show()
6.实例:2017年与2018年抖音用户分析
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[“font.sans-serif”] = [“SimHei”]
data_2017 = np.array([21, 35, 22, 19, 3])
data_2018 = np.array([13, 32, 27, 27, 1])
x = np.arange(5)
y = np.array([51, 73, 99, 132, 45])
labels = np.array([‘一线城市’, ‘二线城市’, ‘三线城市’, ‘四线及以外’, ‘其他国家及地区’])
# 平均增长倍数
average = 75
bar_width = 0.5
# 添加无指向型注释文本
def autolabel(ax, rects):
#在每个矩形条的上方附加一个文本标签, 以显示其高度
for rect in rects:
height = rect.get_height() # 获取每个矩形条的高度
ax.text(rect.get_x() + bar_width/2, height + 3, s=’{}’.format(height), ha=‘center’, va=‘bottom’)
# 第1个子图
ax_one = plt.subplot2grid((3,2), (0,0), rowspan=2, colspan=2)
bar_rects = ax_one.bar(x, y, tick_label=labels, color=’#20B2AA’, width=bar_width)
ax_one.set_title(‘抖音2018vs2017人群增长倍数’)
ax_one.set_ylabel(‘增长倍数’)
autolabel(ax_one, bar_rects)
ax_one.set_ylim(0, y.max() + 20)
ax_one.axhline(y=75, linestyle=’–’, linewidth=1, color=‘gray’)
# 第2个子图
ax_two = plt.subplot2grid((3,2), (2,0))
ax_two.pie(data_2017, radius=1.5, labels=labels, autopct=’%3.1f %%’, colors=[’#2F4F4F’, ‘#FF0000’, ‘#A9A9A9’, ‘#FFD700’, ‘#B0C4DE’])
ax_two.set_title(‘2017年抖音用户地区分布的比例’)
# 第3个子图
ax_thr = plt.subplot2grid((3,2), (2,1))
ax_thr.pie(data_2018, radius=1.5, labels=labels, autopct=’%3.1f %%’, colors=[’#2F4F4F’, ‘#FF0000’, ‘#A9A9A9’, ‘#FFD700’, ‘#B0C4DE’ ])
ax_thr.set_title(‘2018年抖音用户地区分布的比例’)
# 调整子图之间的距离
plt.tight_layout()
plt.show()
7.使用subplots()控制sharex和sharey来是否共享子图的坐标轴
**
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘axes.unicode_minus’] = False
x1 = np.linspace(0, 2 *np.pi, 400)
x2 = np.linspace(0.01, 10, 100)
x3 = np.random.rand(10)
x4 = np.arange(0,6,0.5)
y1 = np.cos(x1 ** 2)
y2 = np.sin(x2)
y3 = np.linspace(0,3,10)
y4 = np.power(x4,3)
# 共享每一列子图之间的x 轴
fig, ax_arr = plt.subplots(2, 2, sharex=‘col’)
ax1 = ax_arr[0, 0]
ax1.plot(x1, y1)
ax2 = ax_arr[0, 1]
ax2.plot(x2, y2)
ax3 = ax_arr[1, 0]
ax3.scatter(x3, y3)
ax4 = ax_arr[1, 1]
ax4.scatter(x4, y4)
plt.show()
8.实例:某地区全年平均气温与降水量、蒸发量的关系
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[“font.sans-serif”] = [“SimHei”]
plt.rcParams[“axes.unicode_minus”] = False
month_x = np.arange(1, 13, 1)
# 平均气温
data_tem = np.array([2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 33.4, 23.0, 16.5, 12.0, 6.2])
# 降水量
data_precipitation = np.array([2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3])
# 蒸发量
data_evaporation = np.array([2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3])
fig, ax = plt.subplots()
bar_ev = ax.bar(month_x, data_evaporation, color=‘orange’, tick_label=[‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’,‘7月’, ‘8月’, ‘9月’, ‘10月’, ‘11月’, ‘12月’])
bar_pre = ax.bar(month_x, data_precipitation, bottom=data_evaporation, color=‘green’)
ax.set_ylabel(‘水量 (ml)’)
ax.set_title(‘平均气温与降水量、蒸发量的关系’)
ax_right = ax.twinx()
line = ax_right.plot(month_x, data_tem, ‘o-m’)
ax_right.set_ylabel(‘气温(KaTeX parse error: Got function '\newline' with no arguments as superscript at position 1: \̲n̲e̲w̲l̲i̲n̲e̲C)’)
# 添加图例
plt.legend([bar_ev, bar_pre, line[0]], [‘蒸发量’, ‘降水量’, ‘平均气温’], shadow=True, fancybox=True)
plt.show()
9.使用subplots()或constrained_layout参数或者修改figure.constrained_layout.use来约束布局
**
import matplotlib.pyplot as plt
# 绘制子图并启用约束布局
fig, axs = plt.subplots(2, 2, constrained_layout=True)
ax_one = axs[0, 0]
ax_one.set_title(“2020080603021”, color=‘red’)
ax_two = axs[0, 1]
ax_two.set_title(“2020080603021”, color=‘blue’)
ax_thr = axs[1, 0]
ax_thr.set_title(“2020080603021”, color=‘purple’)
ax_fou = axs[1, 1]
ax_fou.set_title(“2020080603021”, color=‘green’)
plt.show()
10.通过调用tight_layout()函数或者修改figure.autolayoutrcParam配置来实现紧密布局
**
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2)
ax_one = axs[0, 0]
ax_one.set_title(“2020080603021”, color=‘red’)
ax_two = axs[0, 1]
ax_two.set_title(“2020080603021”, color=‘blue’)
ax_thr = axs[1, 0]
ax_thr.set_title(“2020080603021”, color=‘purple’)
ax_fou = axs[1, 1]
ax_fou.set_title(“2020080603021”, color=‘green’)
# 调整子图之间的距离
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=2)
plt.show()
**
11.使用gridspec模块指定自定义布局
**
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig2 = plt.figure()
spec2 = gridspec.GridSpec(ncols=2, nrows=2, figure=fig2)
f2_ax1 = fig2.add_subplot(spec2[0, 0])
plt.title(“2020080603021”, color=‘red’)
f2_ax2 = fig2.add_subplot(spec2[0, 1])
plt.title(“2020080603021”, color=‘blue’)
f2_ax3 = fig2.add_subplot(spec2[1, 0])
f2_ax4 = fig2.add_subplot(spec2[1, 1])
plt.show()
fig3 = plt.figure()
gs = fig3.add_gridspec(3, 3)
f3_ax1 = fig3.add_subplot(gs[0, :])
f3_ax1.set_title(‘gs[0, :]’, color=‘black’)
f3_ax2 = fig3.add_subplot(gs[1, :-1])
f3_ax2.set_title(‘gs[1, :-1]’, color=‘blue’)
f3_ax3 = fig3.add_subplot(gs[1:, -1])
f3_ax3.set_title(‘gs[1:, -1]’, color=‘purple’)
f3_ax4 = fig3.add_subplot(gs[-1, 0])
f3_ax4.set_title(‘gs[-1, 0]’, color=‘green’)
f3_ax5 = fig3.add_subplot(gs[-1, -2])
f3_ax5.set_title(‘gs[-1, -2]’, color=‘red’)
**
12.实例:2018年上半年某品牌汽车销售情况
**
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.rcParams[“font.sans-serif”] = [“SimHei”]
x_month = np.array([‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’])
y_sales = np.array([2150, 1050, 1560, 1480, 1530, 1490])
x_citys = np.array([‘北京’, ‘上海’, ‘广州’, ‘深圳’, ‘浙江’, ‘山东’])
y_sale_count = np.array([83775, 62860, 59176, 64205, 48671, 39968])
# 创建画布和布局
fig = plt.figure(constrained_layout=True)
gs = fig.add_gridspec(2, 2)
ax_one = fig.add_subplot(gs[0, :])
ax_two = fig.add_subplot(gs[1, 0])
ax_thr = fig.add_subplot(gs[1, 1])
# 第1个子图
ax_one.bar(x_month, y_sales, width=0.5, color=’#3299CC’)
ax_one.set_title(‘2018年上半年某品牌汽车的销售额’)
ax_one.set_ylabel(‘销售额(亿元)’)
# 第2个子图
ax_two.plot(x_citys, y_sale_count, ‘m–o’, ms=8)
ax_two.set_title(‘分公司某品牌汽车的销量’)
ax_two.set_ylabel(‘销量(辆)’)
# 第3个子图
ax_thr.stackplot(x_citys, y_sale_count, color=’#9999FF’)
ax_thr.set_title(‘分公司某品牌汽车的销量’)
ax_thr.set_ylabel(‘销量(辆)’)
**
13.使用axes()函数向任意位置添加坐标轴
**
import matplotlib.pyplot as plt
ax = plt.axes((0.2, 0.5, 0.3, 0.3))
plt.title(“2020080603021”, color=‘red’)
ax.plot([1, 2, 3, 4, 5])
ax2 = plt.axes((0.6, 0.4, 0.2, 0.2))
plt.title(“2020080603021”, color=‘blue’)
ax2.plot([1, 2, 3, 4, 5])
plt.show()
**
14.使用locator刻度定位器和formatter刻度格式器来定制刻度的位置和格式
**
import matplotlib.pyplot as plt
from datetime import datetime
from matplotlib.dates import DateFormatter, HourLocator
ax = plt.gca()
hour_loc = HourLocator(interval=2)
date_fmt = DateFormatter(’%Y/%m/%d’)
ax.xaxis.set_major_locator(hour_loc)
ax.xaxis.set_major_formatter(date_fmt)
plt.tick_params(labelrotation=30)
plt.title(“2020080603021”, color=‘red’)
plt.show()
**
15.实例:深圳市24小时的平均风速
**
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, HourLocator
plt.rcParams[“font.sans-serif”] = [“SimHei”]
plt.rcParams[“axes.unicode_minus”] = False
dates = [‘201910240’,‘2019102402’,‘2019102404’,‘2019102406’,
‘2019102408’,‘2019102410’,‘2019102412’, ‘2019102414’,
‘2019102416’,‘2019102418’,‘2019102420’,‘2019102422’,‘201910250’ ]
x_date = [datetime.strptime(d, ‘%Y%m%d%H’) for d in dates]
y_data = np.array([7, 9, 11, 14, 8, 15, 22, 11, 10, 11, 11, 13, 8])
fig = plt.figure()
ax = fig.add_axes((0.0, 0.0, 1.0, 1.0))
ax.plot(x_date, y_data, ‘->’, ms=8, mfc=’#FF9900’)
ax.set_title(’ 深圳市24小时的平均风速’)
ax.set_xlabel(‘时间(h)’)
ax.set_ylabel(‘平均风速(km/h)’)
# 设置 x 轴主刻度的位置和格式
date_fmt = DateFormatter(’%H:%M’)
ax.xaxis.set_major_formatter(date_fmt)
ax.xaxis.set_major_locator(HourLocator(interval=2))
ax.tick_params(direction=‘in’, length=6, width=2, labelsize=12)
ax.xaxis.set_tick_params(labelrotation=45)
plt.show()
————————————————