第五章. 可视化数据分析图

5.7 综合应用

双Y轴可视化数据分析图表的实现 (柱形图+折线图)

双y轴,顾名思义就是两个y轴,可以通过双y轴看出发展情况的同时,还可以看到正常速度。

1).注意:

add_subplot一定要放在创建画布(matplotlib.pyplot.figure)之后,其他操作之前,放在后面可能会出现双坐标轴的情况

2).示例:

Excel中的数据:

python 双柱状图 上下 python双y轴柱状图_数据分析


代码:

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()

结果展示:

python 双柱状图 上下 python双y轴柱状图_matplotlib_02

堆叠柱形图可视化数据分析图表的实现

堆叠柱形图可以直观,贴切的反应不同产品,不同人群的体验效果。

1).示例:

Excel中的数据:

python 双柱状图 上下 python双y轴柱状图_python 双柱状图 上下_03


代码:

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()

结果展示:

python 双柱状图 上下 python双y轴柱状图_ico_04

颜色渐变饼形图的实现

根据所占比例自动配置渐变色,占比越大颜色越深,占比越小颜色越浅。

1).示例1:

Excel中的数据:

python 双柱状图 上下 python双y轴柱状图_python_05


代码:

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()

结果展示:

python 双柱状图 上下 python双y轴柱状图_python_06

等高线图的实现 (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()

结果展示:

python 双柱状图 上下 python双y轴柱状图_matplotlib_07

代码中所涉及到的函数和参数,在图表的常用设置1 和 图表的常用设置2 有所介绍