合并具有共享x轴的matplotlib子图

iro*_*man 16 python matplotlib subplot

我有两个图表,其中两个具有相同的x轴,但具有不同的y轴标度.

具有常规轴的图是具有描绘衰减的趋势线的数据,而y半对数缩放描绘了拟合的准确性.

fig1 = plt.figure(figsize=(15,6))
ax1 = fig1.add_subplot(111)

# Plot of the decay model 
ax1.plot(FreqTime1,DecayCount1, '.', color='mediumaquamarine')

# Plot of the optimized fit
ax1.plot(x1, y1M, '-k', label='Fitting Function: $f(t) = %.3f e^{%.3f\t} \
         %+.3f$' % (aR1,kR1,bR1))

ax1.set_xlabel('Time (sec)')
ax1.set_ylabel('Count')
ax1.set_title('Run 1 of Cesium-137 Decay')

# Allows me to change scales
# ax1.set_yscale('log')
ax1.legend(bbox_to_anchor=(1.0, 1.0), prop={'size':15}, fancybox=True, shadow=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

现在,我正试着像这个链接http://matplotlib.org/examples/pylab_examples/subplots_demo.html提供的示例一样努力实现两者.

特别是这一个

在此输入图像描述

在查看示例的代码时,我对如何植入3件事情感到有点困惑:

1)以不同方式缩放轴

2)保持指数衰减图的图形大小相同,但是线图具有较小的y尺寸和相同的x尺寸.

例如:

在此输入图像描述

3)保持函数的标签仅出现在衰减图中.

非常感激任何的帮助.

Ser*_*ity 23

查看其中的代码和注释:

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

# Simple data to display in various forms
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig = plt.figure()
# set height ratios for sublots
gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) 

# the fisrt subplot
ax0 = plt.subplot(gs[0])
# log scale for axis Y of the first subplot
ax0.set_yscale("log")
line0, = ax0.plot(x, y, color='r')

#the second subplot
# shared axis X
ax1 = plt.subplot(gs[1], sharex = ax0)
line1, = ax1.plot(x, y, color='b', linestyle='--')
plt.setp(ax0.get_xticklabels(), visible=False)
# remove last tick label for the second subplot
yticks = ax1.yaxis.get_major_ticks()
yticks[-1].label1.set_visible(False)

# put lened on first subplot
ax0.legend((line0, line1), ('red line', 'blue line'), loc='lower left')

# remove vertical gap between subplots
plt.subplots_adjust(hspace=.0)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 请注意,可以在一次调用中创建两个轴:`fig, (ax0, ax1) = plt.subplots(2,1, sharex=True, gridspec_kw=dict(height_ratios=[2, 1]))` (2认同)

Ara*_*ray 10

这是我的解决方案:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig, (ax1,ax2) = plt.subplots(nrows=2, sharex=True, subplot_kw=dict(frameon=False)) # frameon=False removes frames

plt.subplots_adjust(hspace=.0)
ax1.grid()
ax2.grid()

ax1.plot(x, y, color='r')
ax2.plot(x, y, color='b', linestyle='--')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

一种选择是seaborn.FacetGrid但这需要 Seaborn 和 Pandas 库。