28

我正在寻找降低不同子图上刻度标签的密度

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()

这导致 在此处输入图像描述

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

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

4

4 回答 4

55

一种通用的方法是告诉 matplotlib 所需的刻度数:

plt.locator_params(nbins=10)

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

ax.locator_params(nbins=10, axis='x')
于 2014-05-08T06:39:07.190 回答
39

对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()

希望这可以帮助。

于 2012-10-24T16:55:56.903 回答
21

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

import numpy as np
ax0.yaxis.set_ticks(np.arange(70000,80000,2500))

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

于 2012-10-24T16:22:22.293 回答
1

如果您使用的不是数字的 x 轴值数组(例如日期),我建议使用以下方法:

import numpy as np
import matplotlib.pyplot as plt


distance_between_ticks = 10
reduced_xticks = x_arr[np.arange(0, len(x_arr), distance_between_ticks)]
    
fig, ax = plt.subplots()

# plot stuff

ax.set_xticks(reduced_xticks)

numpy.arange函数将生成一个等距索引数组,然后将其应用于 x 轴数组。

警告x_arr数组必须支持这种索引方法(即我建议确保它是一个 numpy 数组)。

于 2021-06-30T15:10:23.157 回答