调整图中的y-lim比例(matplotlib,pandas)以实现两个图的相同比例

时间:2017-04-23 12:48:20

标签: python pandas matplotlib

我的数据框看起来像这样:

   AgeGroups Factor Cancer  Frequency
0      00-05      B    Yes        223
1      00-05      A     No        108
2      00-05      A    Yes          0
3      00-05      B     No       6575
4      11-15      B    Yes        143
5      11-15      A     No          5
6      11-15      A    Yes          1
7      11-15      B     No       3669
8      16-20      B    Yes        395
9      16-20      A     No         28
10     16-20      A    Yes          1
11     16-20      B     No       6174
12     21-25      B    Yes        624
13     21-25      A     No         80
14     21-25      A    Yes          2
15     21-25      B     No       8173
16     26-30      B    Yes        968
17     26-30      A     No        110
18     26-30      A    Yes          2
19     26-30      B     No       9143
20     31-35      B    Yes       1225
21     31-35      A     No        171
22     31-35      A    Yes          5
23     31-35      B     No       9046
24     36-40      B    Yes       1475
25     36-40      A     No        338
26     36-40      A    Yes         21
27     36-40      B     No       8883
28     41-45      B    Yes       2533
29     41-45      A     No        782
..       ...    ...    ...        ...
54     71-75      A    Yes       2441
55     71-75      B     No      15992
56     76-80      B    Yes       4614
57     76-80      A     No       5634
58     76-80      A    Yes       1525
59     76-80      B     No      10531
60     81-85      B    Yes       1869
61     81-85      A     No       2893
62     81-85      A    Yes        702
63     81-85      B     No       5692
64     86-90      B    Yes        699
65     86-90      A     No       1398
66     86-90      A    Yes        239
67     86-90      B     No       3081
68     91-95      B    Yes        157
69     91-95      A     No        350
70     91-95      A    Yes         47
71     91-95      B     No       1107
72    96-100      B    Yes         31
73    96-100      A     No         35
74    96-100      A    Yes          2
75    96-100      B     No        230
76      >100      B    Yes          5
77      >100      A     No          1
78      >100      A    Yes          1
79      >100      B     No         30
80     06-10      B    Yes        112
81     06-10      A     No          6
82     06-10      A    Yes          0
83     06-10      B     No       2191

代码:

by_factor = counts.groupby(level='Factor')


    k = by_factor.ngroups

    fig, axes = plt.subplots(1, k, sharex=True, sharey=False, figsize=(15, 8))
    for i, (gname, grp) in enumerate(by_factor):
        grp.xs(gname, level='Factor').plot.bar(
            stacked=True, rot=45, ax=axes[i], title=gname)

    fig.tight_layout()

我有一张漂亮的图表,看起来像这样: enter image description here 这实际上是我想要的,直到我意识到我想重新调整我的y轴,使得我可以在两个图表中具有相同的y轴比例。如果您查看右侧图表'B',则y轴的比例为25000,图表'A'的比例为10000.任何人都可以建议在两个图表上具有相同比例的最佳方法是什么? 我试过了:

plt.ylim([0,25000])

在图表'A'中没有做任何改动或没改变任何东西,因为这基本上只改变了图表'B'的y轴。

我非常感谢任何有关两个地块达到相同规模的建议。

3 个答案:

答案 0 :(得分:4)

为循环中的每个轴设置ylim最小值和最大值:

for ax in axes: ax.set_ylim([0,25000])

答案 1 :(得分:2)

使用plt.ylim()只会调整绘制的最后一个数字的轴。要更改特定绘图的y限制,您需要使用ax.set_ylim()

所以在你的情况下,它将是

axes[0].set_ylim(0,25000)
axes[1].set_ylim(0,25000) 

答案 2 :(得分:2)

您当然可以在相应的轴上调用.set_ylim()。这样做的缺点是你需要知道设置的限制。 以下解决方案没有此要求:

sharey

在您的代码中,您明确设置了sharey=False。如果您将其更改为True,则会获得共享的yaxis。然后,您可以使用plt.ylim([0,25000])来限制轴,但您不必这样做,因为它们是共享的并且会自动调整。

最小例子:

import matplotlib.pyplot as plt

fig, (ax, ax2) = plt.subplots(ncols=2, sharex=True, sharey=True)

ax.plot([1,3,2])
ax2.plot([2,3,1])

plt.show()

enter image description here

可以看出共享轴的勾选标签是隐藏的,这在许多情况下可能是理想的。

加入共享轴

有两个轴,您可以使用

使它们共享相同的比例
import matplotlib.pyplot as plt

fig, (ax, ax2) = plt.subplots(ncols=2, sharex=True, sharey=False)
ax.get_shared_x_axes().join(ax, ax2)

ax.plot([1,3,2])
ax2.plot([2,3,1])

plt.show()

enter image description here

这里的ticklabels保持可见。如果您不想要,可以通过ax2.set_yticklabels([])将其关闭。