第五章. 可视化数据分析图
5.7 综合应用
1.双Y轴可视化数据分析图表的实现 (柱形图+折线图)
双y轴,顾名思义就是两个y轴,可以通过双y轴看出发展情况的同时,还可以看到正常速度。
1).注意:
add_subplot一定要放在创建画布(matplotlib.pyplot.figure)之后,其他操作之前,放在后面可能会出现双坐标轴的情况
2).示例:
Excel中的数据:
代码:
import matplotlib.pyplot as plt
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet5')
print(df)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# 创建画布
fig = plt.figure(figsize=(8, 6))
# add_subplot一定要放在前面,放在后面会出现双坐标轴的情况
ax1 = fig.add_subplot(1, 1, 1)
# 创建标题
plt.title("销量情况对比")
# 双Y轴可视化数据分析图表的实现
# 柱形图
ax1.bar(x=df['书名'], height=df['销量(本)'], width=0.5, label='left')
ax1.set_xlabel("书名")
ax1.set_ylabel("销量(本)")
# 折线图
ax2 = ax1.twinx()#共享x轴,添加一条y轴坐标轴
ax2.plot(df['书名'], df['增量(%)'], color='black', linestyle='--', linewidth=1, marker='o', label=u'增量')
ax2.set_ylabel("增长量(%)")
# 设置文本标签
for x, y in zip(df['书名'], df['增量(%)']):
ax2.text(x, y, '%.2f' % y, ha='center', va='bottom', fontsize=10, color='r')
# 显示图像
plt.show()
结果展示:
2.堆叠柱形图可视化数据分析图表的实现
堆叠柱形图可以直观,贴切的反应不同产品,不同人群的体验效果。
1).示例:
Excel中的数据:
代码:
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet2')
print(df)
# 设置画布
fig = plt.figure(figsize=(8, 6), facecolor='y')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# X,Y轴刻度线的显示方向
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
x_label = df['姓名']
# # 柱形图
# x_label = np.arange(len(x_label)) # x轴刻度标签位置
width = 0.35 # 柱子的宽度
plt.bar(x_label, df['生物'], width=width, color='orange')
plt.bar(x_label, df['化学'], width=width, color='skyblue', bottom=df['生物'])
# 设置网格线
plt.grid(axis='y', color='0.5', linestyle='--', linewidth=1)
# 设置x,y轴坐标
plt.xlabel('姓名')
plt.ylabel('分数')
# # 设置坐标轴刻度
plt.xticks(x_label, df['姓名'])
plt.yticks(range(0, 201, 10))
# 设置文本标签
for x, y in zip(x_label, df['生物']):
plt.text(x, y, '%.1f' % y, ha='center', va='baseline', fontsize=10, color='g')
for x, y, z in zip(x_label, df['生物'], df['化学']):
plt.text(x, y+z, '%.1f' % z, ha='center', va='baseline', fontsize=10, color='r')
# 设置标题和图例
plt.title('成绩统计表')
# 设置图标图例
plt.legend(['生物', '化学'],
loc='upper right') # 手动添加图例时,有时文本会显示不全,在文本后面加一个逗号(,)可解决,例如('图书采购价目',)
# 调整图表与画布边缘间距
plt.subplots_adjust(left=0.15, bottom=0.15, right=0.9, top=0.9)
# 坐标轴的刻度线向内显示还是向外显示
plt.tick_params(left=True, bottom=True, right=False, top=False)
# 显示图像
plt.show()
结果展示:
3.颜色渐变饼形图的实现
根据所占比例自动配置渐变色,占比越大颜色越深,占比越小颜色越浅。
1).示例1:
Excel中的数据:
代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import font_manager as fm
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('F:\\Note\\清单.xlsx', sheet_name='Sheet5')
print(df)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False # 解决负号不显示的问题
# 设置画布
fig, ax = plt.subplots(figsize=(8, 6), facecolor='w')
# 饼图的颜色配置:颜色地图:秋天->彩虹->灰色->春天->黑色
colors = cm.rainbow(np.arange(len(df['销量(本)']))/ len(df['销量(本)']))
# 立体感带阴影的饼形图
patches, texts, autotexts = ax.pie(df['销量(本)'], labels=df['书名'], labeldistance=1.1, autopct='%.2f%%',
startangle=90,
shadow=True,
radius=0.8, center=(0, 0), textprops={'fontsize': 9, 'color': 'k'}, pctdistance=0.6,
colors=colors)
ax.axis('equal')
# 重新设置字体颜色
proptease = fm.FontProperties()
# 字体大小:从小到大
proptease.set_size("small")
# 设置属性
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
# 设置标题和图例
ax.set_title('销量占比')
# 显示图像
plt.show()
结果展示:
4.等高线图的实现 (matplotlib.pyplot.contourf)
等高线图是在地理课中讲述山峰山谷时绘制的图形中,在机器学习中也会被用在绘制梯度下降算法的图像中。
1).关键代码解析:
画等高线的核心函数时Matplotlib的contourf函数,但设个函数中的参数x,y对应的值是二位数据,需要使用Numpy的meshgrid方法,将x,y转换成二维数据,np.meshgrid(x,y)
2).示例:
代码:
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
# 设置画布
fig = plt.figure(figsize=(8, 6), facecolor='w')
# 生成x,y的数据
space = 256
x = np.linspace(-4, 4, space)
y = np.linspace(-4, 4, space)
# 把x,y转换为二维数据
X, Y = np.meshgrid(x, y)
# 绘制等高线
plt.contourf(X, Y, f(X, Y))
# 显示图像
plt.show()
结果展示: