查看原文
其他

Python可视化32|matplotlib-断裂坐标轴(broken_axis)|图例(legend)详解

pythonic生物人 pythonic生物人 2022-09-11

"pythonic生物人"的第77篇分享

当数据不在一个数量级上,但又要在一张图上同时反映大数据和小数据的变化规律,需要绘制断裂坐标轴。

本文详细介绍如何绘制断裂坐标轴(broken_axis)及图例(legend)设置。

本文速览

更多教程,欢迎关注@pythonic生物人 

目录

1、x轴坐标轴断裂 or 打断
2、y轴坐标轴断裂 or 打断
3、brokenaxes打断坐标轴
4、图例设置 
loc参数详解

断裂坐标轴的原理是在不同子图上绘制同一图,设置子图轴显示范围,去掉子图脊,使得看起来像一张图。

1、x轴坐标轴断裂 or 打断

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

pts = np.random.rand(30)*.2
pts[[314]] += 1.8# 将索引为3个和14的元素加1.8处理成两个离散点


fig, (ax1, ax2) = plt.subplots(12, sharey=True, dpi=100)


ax1.plot(pts)
ax2.plot(pts)

ax1.set_xlim(010)  #  子图1设置y轴范围,只显示部分图
ax2.set_xlim(1120)  # 子图2设置y轴范围,只显示部分图


ax1.spines['right'].set_visible(False)#关闭子图1中底部脊
ax2.spines['left'].set_visible(False)##关闭子图2中顶部脊
d = .85  #设置倾斜度

#绘制断裂处的标记
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=15,
              linestyle='none', color='r', mec='r', mew=1, clip_on=False)
ax1.plot([11], [10],transform=ax1.transAxes, **kwargs)
ax2.plot([00], [01], transform=ax2.transAxes, **kwargs)

plt.tight_layout()
plt.show()

2、y轴坐标轴断裂 or 打断

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

pts = np.random.rand(30)*.2
pts[[314]] += 1.8#将索引为3个和14的元素加1.8处理成两个离散点


fig, (ax1, ax2) = plt.subplots(21, sharex=True, dpi=100)


ax1.plot(pts)
ax2.plot(pts)

ax1.set_ylim(.42.)  # 子图1设置y轴范围,只显示部分图
ax2.set_ylim(0.28)  # 子图2设置y轴范围,只显示部分图


ax1.spines['bottom'].set_visible(False)#关闭子图1中底部脊
ax2.spines['top'].set_visible(False)##关闭子图2中顶部脊
ax2.set_xticks(range(0,31,1))


d = .85  #设置倾斜度
#绘制断裂处的标记
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=15,
              linestyle='none', color='r', mec='r', mew=1, clip_on=False)
ax1.plot([01], [00],transform=ax1.transAxes, **kwargs)
ax2.plot([01], [11], transform=ax2.transAxes, **kwargs)

plt.tight_layout()
plt.show()

以上方法可以设置的很个性化,但是特别繁琐,想更简单,请使用brokenaxes。


3、brokenaxes打断坐标轴

该方法非常简单,相较于1,2方法。

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

fig = plt.figure(dpi=120)
bax = brokenaxes(xlims=((010), (1120)), #设置x轴裂口范围
                 ylims=((00.28), (0.42)), #设置y轴裂口范围
                 hspace=0.25,#y轴裂口宽度
                 wspace=0.2,#x轴裂口宽度                 
                 despine=False,#是否y轴只显示一个裂口
                 diag_color='r',#裂口斜线颜色                
                
                )
bax.plot(pts)
plt.show()

4、图例设置

import matplotlib.pyplot as plt

plt.figure(dpi=100)
#plt.style.use('seaborn-whitegrid')
plt.plot([123], 
         label='legend1',#label添加图例名称
        )
plt.plot([246], 
         label='legend2',#label添加图例名称
        )

legend = plt.legend(loc=9,#图例位置
                    bbox_to_anchor=(0.451),#控制图例相对于figure,这里不是axes的位置,改参数设置后loc不起作用
                    ncol=2,#图例分两行显示,当分组很多时特别有用
                    fontsize=10,#图例大小
                    title='Legend',#图例标题
                    title_fontsize=10,#标题字号
                    shadow=True,#背景阴影
                    fancybox=True,#背景框四个角为圆角
                    framealpha=1,##背景框透明度
                    facecolor='#BAE4B3',#背景框填充颜色
                    edgecolor='r',#背景框颜色
                    #更多参数:matplotlib.pyplot.legend
                   )
plt.show()
  • loc参数详解

控制图例在图中位置,有11个参数可选择,如下:

Location String Location Code
'best' 0
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10

参考资料

  • https://github.com/bendichter/brokenaxes
  • https://matplotlib.org/examples/pylab_examples/broken_axis.html
  • https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html?highlight=legend#matplotlib.pyplot.legend

更多教程,欢迎关注@pythonic生物人



往期文章

Python可视化28|matplotlib绘制韦恩图(2-6组数据)
Python可视化29|matplotlib-饼图(pie)
Python可视化30|matplotlib-辅助线(axhline|vlines|axvspa|axhspan)
Python可视化31|matplotlib-图添加文本(text)及注释(annotate)

"点赞"、"在看"鼓励下呗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存