pythonic生物人

详解Python可视化-断裂坐标轴、图例!

本文分享Python可视化-断裂坐标轴、图例!

Image

  第一时间获取干货
「pythonic生物人」群👉
加入

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

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

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

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

ax1.set_xlim(0, 10)  #  子图1设置y轴范围,只显示部分图
ax2.set_xlim(11, 20)  # 子图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([1, 1], [1, 0],transform=ax1.transAxes, **kwargs)
ax2.plot([0, 0], [0, 1], transform=ax2.transAxes, **kwargs)

plt.tight_layout()
plt.show()

Image

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

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

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

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

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

ax1.set_ylim(.4, 2.)  # 子图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([0, 1], [0, 0],transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

plt.tight_layout()
plt.show()

Image以上方法可以设置的很个性化,但是特别繁琐,想更简单,请使用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=((0, 10), (11, 20)), #设置x轴裂口范围
                 ylims=((0, 0.28), (0.4, 2)), #设置y轴裂口范围
                 hspace=0.25,#y轴裂口宽度
                 wspace=0.2,#x轴裂口宽度                 
                 despine=False,#是否y轴只显示一个裂口
                 diag_color='r',#裂口斜线颜色                

                                )
bax.plot(pts)
plt.show()

Image

4、图例设置

import matplotlib.pyplot as plt

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

legend = plt.legend(loc=9,#图例位置
                    bbox_to_anchor=(0.45, 1),#控制图例相对于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()

Image
  • 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

-END-

Image

  第一时间获取干货
「pythonic生物人」群👉
加入

-推荐阅读-
如何学Matplotlib+ggplot2 ?
详解Python CONDA
天天在用的P值到底是个啥?
pythonic生物人去哪了?
《ggplot2: Elegant.....》中文版
最有价值50图表(Python代码)
Jupyter Notebook的16个插件!