matplotlib:如何降低子图中刻度标签的密度?

sol*_*sol 22 python plot matplotlib pandas

我希望降低不同子图上刻度标签的密度

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from StringIO import StringIO
data = """\
    a   b   c   d
z   54.65   6.27    19.53   4.54
w   -1.27   4.41    11.74   3.06
d   5.51    3.39    22.98   2.29
t   76284.53    -0.20   28394.93    0.28
"""
df = pd.read_csv(StringIO(data), sep='\s+')
gs = gridspec.GridSpec(3, 1,height_ratios=[1,1,4] )
ax0 = plt.subplot(gs[0])
ax1 = plt.subplot(gs[1])
ax2 = plt.subplot(gs[2])
df.plot(kind='bar', ax=ax0,color=('Blue','DeepSkyBlue','Red','DarkOrange'))
df.plot(kind='bar', ax=ax1,color=('Blue','DeepSkyBlue','Red','DarkOrange'))
df.plot(kind='bar', ax=ax2,color=('Blue','DeepSkyBlue','Red','DarkOrange'),rot=45)
ax0.set_ylim(69998, 78000)
ax1.set_ylim(19998, 29998)
ax2.set_ylim(-2, 28)
ax0.legend().set_visible(False)
ax1.legend().set_visible(False)
ax2.legend().set_visible(False)
ax0.spines['bottom'].set_visible(False)
ax1.spines['bottom'].set_visible(False)
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax0.xaxis.set_ticks_position('none')
ax1.xaxis.set_ticks_position('none')
ax0.xaxis.set_label_position('top')
ax1.xaxis.set_label_position('top')
ax0.tick_params(labeltop='off')
ax1.tick_params(labeltop='off', pad=15)
ax2.tick_params(pad=15)
ax2.xaxis.tick_bottom()
d = .015
kwargs = dict(transform=ax0.transAxes, color='k', clip_on=False)
ax0.plot((-d,+d),(-d,+d), **kwargs)
ax0.plot((1-d,1+d),(-d,+d), **kwargs)
kwargs.update(transform=ax1.transAxes)
ax1.plot((-d,+d),(1-d,1+d), **kwargs)
ax1.plot((1-d,1+d),(1-d,1+d), **kwargs)
ax1.plot((-d,+d),(-d,+d), **kwargs)
ax1.plot((1-d,1+d),(-d,+d), **kwargs)
kwargs.update(transform=ax2.transAxes)
ax1.plot((-d,+d),(1-d/4,1+d/4), **kwargs)
ax1.plot((1-d,1+d),(1-d/4,1+d/4), **kwargs)
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果 在此输入图像描述

我想减少两个上部子图中的刻度标签.怎么做 ?谢谢.

奖励:1)如何在条形基础上摆脱y = 0上的虚线?2)如何摆脱子图0和1之间的x-trick标签?3)如何将图的背面设置为透明度?(参见图中背后消失的右下方断开的y轴线)

Sau*_*tro 49

一般方法是告诉matplotlib所需的滴答数:

plt.locator_params(nbins=10)
Run Code Online (Sandbox Code Playgroud)

通过@Daniel Power的评论进行编辑:要更改轴上的单个轴(例如'x'),请使用:

ax.locator_params(nbins=10, axis='x')
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于对数轴(至少使用旧的 matplotlib 1.4.3)。对数轴是否有解决方法或等效功能? (3认同)
  • 要更改轴上的单个轴(例如 x),请使用: ax.locator_params(nbins=10,axis='x') (2认同)
  • 我收到一个 `TypeError: set_params() got an unexpected keyword argument 'nbins'` 知道它有什么问题吗? (2认同)
  • 调用 locator_params。我无法获得完整的回溯错误,评论太长了。在这里更进一步:`文件“C:\Users\...\AppData\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\axes\_base.py”,第 2554 行,在 locator_params self.yaxis.get_major_locator ().set_params(**kwargs) TypeError: set_params() 得到了一个意外的关键字参数 'nbins'` (2认同)

小智 35

Aman的方法建议的改进如下:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# ... plot some things ...

# Find at most 101 ticks on the y-axis at 'nice' locations
max_yticks = 100
yloc = plt.MaxNLocator(max_yticks)
ax.yaxis.set_major_locator(yloc)

plt.show()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 看起来MaxNLocator对象只能用于单个轴.如果对多个具有不同刻度的轴重复使用定位器,则最终刻度将用于所有轴. (2认同)

Ama*_*man 17

您可以将刻度设置为您想要的位置,就像设置xticks一样.

import numpy as np
ax0.yaxis.set_ticks(np.arange(70000,80000,2500))
Run Code Online (Sandbox Code Playgroud)

这将为ax0子图创建四个均匀间隔的刻度.您可以为其他子图做类似的事情.