分享

Python 可视化:x、y 轴截断图

 NeighborMrSun 2023-03-05 发布于湖南

「—matplotlib 绘制 x、y 轴截断图」

内容概要

想要在一个图形上形象地展示两个数量级差别较大的数据的变化趋势时,上期介绍的双 y 轴图Python可视化:双y轴图/R语言可视化:双y轴图,是一种很好的可视化方法,它能确保某个变量的变化趋势不会被另一个变量所影响。而当同一类型数据中存在差别较大的极端值时,使用坐标轴截断的可视化方法,可排除极端值对其他数据整体变化趋势的影响。

本期内容将介绍两种方法绘制 x、y 轴截断图,分别为只使用 matplotlib 库的方法,以及使用 matplotlib+brokenaxes库的方法。需要本案例数据和完整代码的于公众号后台回复「20221201」即可。

matplotlib方法

只使用matplotlib库便可实现x、y轴截断图形的绘制。该方法的优点是绘制图形的可自定义性强,便于后续调整图形整体的细节和美观,缺点是相对于第二种方法而言,其代码量偏多。

绘制y轴截断图的代码及其详细注释:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

# 创建用于绘制图片的30个处于0到0.2之间的随机数据点
pts = np.random.rand(30)*0.2

# 在原始数据点中创建两个离群数据点
pts[[314]] += 0.8

# 创建两个绘图坐标轴;调整两个轴之间的距离,即轴断点距离
fig, (ax1, ax2) = plt.subplots(21, sharex=True)
fig.subplots_adjust(hspace=0.05)  # adjust space between axes

# 将用相同的绘图数据,在两个轴上绘制折线图
ax1.plot(pts)
ax2.plot(pts)

# 调整两个y轴的显示范围
ax1.set_ylim(.781.)  # outliers only
ax2.set_ylim(0.22)  # most of the data

# 隐藏两个坐标轴系列之间的横线
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
ax1.xaxis.tick_top()

# 隐藏y轴刻度
ax1.tick_params(axis='x',length=0)
# ax2.xaxis.tick_bottom()

# 添加网格线
ax1.grid(ls='--',alpha=0.5,linewidth=1)
ax2.grid(ls='--',alpha=0.5,linewidth=1)

# 创建轴断刻度线,d用于调节其偏转角度
d = 0.5  # proportion of vertical to horizontal extent of the slanted line
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle='none', color='k', mec='k', mew=1, clip_on=False)
ax1.plot([01], [00], transform=ax1.transAxes, **kwargs)
ax2.plot([01], [11], transform=ax2.transAxes, **kwargs)

plt.savefig('1.broken_yaxis.png', dpi=600, bbox_inches='tight')
plt.show()

输出的y轴截断图:图片

绘制x轴截断图的代码及其详细注释:

import numpy as np
import matplotlib.pyplot as plt

# 创建用于绘制图片的30个处于0到0.2之间的随机数据点
np.random.seed(19680801)
pts = np.random.rand(30)*.2

# 在原始数据点中创建两个离群数据点
pts[[3, 14]] += .8

# 创建两个绘图坐标轴;调整两个轴之间的距离,即轴断点距离
fig, (ax1, ax2) = plt.subplots(1, 2, sharey='all')
fig.subplots_adjust(wspace=0.05)

# 将用相同的绘图数据,在两个轴上绘制折线图
ax1.plot(pts,np.arange(0,30))
ax2.plot(pts,np.arange(0,30))

# 调整两个x轴的显示范围
ax2.set_xlim(0.78, 1.0)  # outliers only
ax1.set_xlim(0, .22)  # most of the data

# 隐藏两个坐标轴系列之间的横线
ax1.spines.right.set_visible(False)
ax2.spines.left.set_visible(False)

# 隐藏y轴刻度
ax2.tick_params(axis='y',length=0)  # 隐藏y轴刻度
# ax2.xaxis.tick_bottom()
# 添加网格线
ax1.grid(ls='--',alpha=0.5,linewidth=1)
ax2.grid(ls='--',alpha=0.5,linewidth=1)

# 创建轴断刻度线,d用于调节其偏转角度
d = 0.5
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=10,linestyle='none',color='k', mec='k', mew=1, clip_on=False)
ax1.plot([1, 1], [1, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 0], [0, 1], transform=ax2.transAxes, **kwargs)

# 保存、输出绘制的图片
plt.savefig('2.broken_xaxis.png', dpi=600,bbox_inches='tight')
plt.show()

输出的x轴截断图:图片


matplotlib+brokenaxes方法

使用matplotlib库结合brokenaxes库,可实现对坐标轴截断图的绘制,相较于第一种方法而言,该方法绘图代码量少,但对图形的自定义性较差。在使用brokenaxes第三方库之前,需要手动将其安装,使用pip的安装方法如下:

pip install brokenaxes

绘制y轴截断图的代码及其详细注释:

import numpy as np
import matplotlib.pyplot as plt
from brokenaxes import brokenaxes

np.random.seed(19680801)

pts = np.random.rand(30)*.2
pts[[3, 14]] += .8

fig = plt.figure(figsize=(8,6))

# 使用brokenaxes函数创建绘图坐标轴体系,ylim参数中输入断点两侧轴范围,
# despine参数控制是否显示上轴和右轴,hspace参数控制断点截断线之间的宽度,d控制断点截断线的长度
ax = brokenaxes(ylims=((0, 0.22), (0.78, 1.0)),despine=False, hspace=0.05,d=0.01)
ax.plot(pts)
ax.grid(ls='--',alpha=0.5,linewidth=1)

plt.savefig('3.broken_yaxis.png', dpi=600,bbox_inches='tight')
plt.show()

输出的y轴截断图:图片

绘制x轴截断图的代码及其详细注释:

import numpy as np
import matplotlib.pyplot as plt
from brokenaxes import brokenaxes

np.random.seed(19680801)

pts = np.random.rand(30)*.2
y = np.arange(0,30)
pts[[314]] += .8

fig = plt.figure(figsize=(8,6))
ax = brokenaxes(xlims=((00.22), (0.781.0)),despine=False, wspace=0.05,d=0.01)
ax.plot(pts,y)
ax.grid(ls='--',alpha=0.5,linewidth=1)

plt.savefig('4.broken_xaxis.png', dpi=600, bbox_inches='tight')
plt.show()

输出的x轴截断图:图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约