matplotlib:覆盖不同尺度的地块?

到目前为止,我有以下代码:

colors = ('k','r','b') ax = [] for i in range(3): ax.append(plt.axes()) plt.plot(datamatrix[:,0],datamatrix[:,i],colors[i]+'o') ax[i].set(autoscale_on=True) 

对于每个坐标轴的autoscale_on=True选项,我认为每个坐标图应该有自己的y轴限制,但是看起来它们都共享相同的值(即使它们共享不同的坐标轴)。 我如何设置它们以扩展显示每个datamatrix[:,i] (只是显式调用.set_ylim() ?)另外,如何为第三个variables创build偏移y轴( datamatrix[:,2] )可能需要上面的? 谢谢大家。

这听起来像你想要的是subplots …你现在做什么没有什么意义(或者我很困惑你的代码片断,无论如何…)。

尝试更像这样的事情:

 import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(nrows=3) colors = ('k', 'r', 'b') for ax, color in zip(axes, colors): data = np.random.random(1) * np.random.random(10) ax.plot(data, marker='o', linestyle='none', color=color) plt.show() 

在这里输入图像描述

编辑:

如果你不想要subplots,你的代码片段更有意义。

您正在尝试添加三个坐标轴。 Matplotlib认识到graphics中已经有一个精确的大小和位置的子图,所以每次都返回相同的轴对象。 换句话说,如果你看看你的列表ax ,你会发现它们都是同一个对象

如果你真的想这样做,每次添加一个轴时,你都需要将fig._seen重置为一个空字典。 不过,你可能并不想这么做。

而不是把三个独立的情节,而不是使用twinx

例如

 import matplotlib.pyplot as plt import numpy as np # To make things reproducible... np.random.seed(1977) fig, ax = plt.subplots() # Twin the x-axis twice to make independent y-axes. axes = [ax, ax.twinx(), ax.twinx()] # Make some space on the right side for the extra y-axis. fig.subplots_adjust(right=0.75) # Move the last y-axis spine over to the right by 20% of the width of the axes axes[-1].spines['right'].set_position(('axes', 1.2)) # To make the border of the right-most axis visible, we need to turn the frame # on. This hides the other plots, however, so we need to turn its fill off. axes[-1].set_frame_on(True) axes[-1].patch.set_visible(False) # And finally we get to plot things... colors = ('Green', 'Red', 'Blue') for ax, color in zip(axes, colors): data = np.random.random(1) * np.random.random(10) ax.plot(data, marker='o', linestyle='none', color=color) ax.set_ylabel('%s Thing' % color, color=color) ax.tick_params(axis='y', colors=color) axes[0].set_xlabel('X-axis') plt.show() 

在这里输入图像描述

使用@ joe-kington的答案快速引导一些东西来绘制多个共享x轴的y轴: 在这里输入图像描述

 # d = Pandas Dataframe, # ys = [ [cols in the same y], [cols in the same y], [cols in the same y], .. ] def chart(d,ys): from itertools import cycle fig, ax = plt.subplots() axes = [ax] for y in ys[1:]: # Twin the x-axis twice to make independent y-axes. axes.append(ax.twinx()) extra_ys = len(axes[2:]) # Make some space on the right side for the extra y-axes. if extra_ys>0: temp = 0.85 if extra_ys<=2: temp = 0.75 elif extra_ys<=4: temp = 0.6 if extra_ys>5: print 'you are being ridiculous' fig.subplots_adjust(right=temp) right_additive = (0.98-temp)/float(extra_ys) # Move the last y-axis spine over to the right by x% of the width of the axes i = 1. for ax in axes[2:]: ax.spines['right'].set_position(('axes', 1.+right_additive*i)) ax.set_frame_on(True) ax.patch.set_visible(False) ax.yaxis.set_major_formatter(matplotlib.ticker.OldScalarFormatter()) i +=1. # To make the border of the right-most axis visible, we need to turn the frame # on. This hides the other plots, however, so we need to turn its fill off. cols = [] lines = [] line_styles = cycle(['-','-','-', '--', '-.', ':', '.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4', 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_']) colors = cycle(matplotlib.rcParams['axes.color_cycle']) for ax,y in zip(axes,ys): ls=line_styles.next() if len(y)==1: col = y[0] cols.append(col) color = colors.next() lines.append(ax.plot(d[col],linestyle =ls,label = col,color=color)) ax.set_ylabel(col,color=color) #ax.tick_params(axis='y', colors=color) ax.spines['right'].set_color(color) else: for col in y: color = colors.next() lines.append(ax.plot(d[col],linestyle =ls,label = col,color=color)) cols.append(col) ax.set_ylabel(', '.join(y)) #ax.tick_params(axis='y') axes[0].set_xlabel(d.index.name) lns = lines[0] for l in lines[1:]: lns +=l labs = [l.get_label() for l in lns] axes[0].legend(lns, labs, loc=0) plt.show() 

感谢Joe Kington的回答,我可以为我的要求提出一个解决scheme,即所有附加的y轴位于图的左侧。

我仍然想知道如何做到这一点,因为这只是一个工作:

 import matplotlib.pyplot as plt import numpy as np # To make things reproducible... np.random.seed(1977) fig, ax = plt.subplots() # Twin the x-axis twice to make independent y-axes. axes = [ax, ax.twinx(), ax.twinx()] # Make some space on the right side for the extra y-axis. fig.subplots_adjust(right=0.75) # Move the last y-axis spine over to the right by 20% of the width of the axes axes[1].spines['right'].set_position(('axes', -0.25)) axes[2].spines['right'].set_position(('axes', -0.5)) # To make the border of the right-most axis visible, we need to turn the frame # on. This hides the other plots, however, so we need to turn its fill off. axes[-1].set_frame_on(True) axes[-1].patch.set_visible(False) # And finally we get to plot things... colors = ('Green', 'Red', 'Blue') intAxNo = 0 for ax, color in zip(axes, colors): intAxNo += 1 data = np.random.random(1) * np.random.random(10) ax.plot(data, marker='o', linestyle='none', color=color) if (intAxNo > 1): if (intAxNo == 2): ax.set_ylabel('%s Thing' % color, color=color, labelpad = -40 ) elif (intAxNo == 3): ax.set_ylabel('%s Thing' % color, color=color, labelpad = -45 ) ax.get_yaxis().set_tick_params(direction='out') else: ax.set_ylabel('%s Thing' % color, color=color, labelpad = +0 ) ax.tick_params(axis='y', colors=color) axes[0].set_xlabel('X-axis') plt.show() 

在这里输入图像描述