【问题标题】:Trouble plotting legend/axis for matplotlib subplots无法为 matplotlib 子图绘制图例/轴
【发布时间】:2015-02-21 18:49:18
【问题描述】:

所以我有一些数据要在 matplotlib 中绘制。所以我的数据有一些我试图绘制的变量。我想要做的是为每个位置制作一个子图,每个子图都有多个组,我想显示值如何随时间变化。我的数据的一个例子是:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

df = pd.DataFrame({
               "GEO": [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3],
               "year": [2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011],
               "GROUP": ['doctor','doctor','Knight','Knight','Wizard','Wizard','doctor','doctor','Knight','Knight','Wizard','Wizard','doctor','doctor','Knight','Knight','Wizard','Wizard'], 
                "Value": random.sample(xrange(100), 18)
})

provs = df["GEO"].unique()
f, axarr = plt.subplots(len(provs), sharex=True, sharey=True)
myplot = 0

for prov in provs:
    groups = df.loc[df["GEO"] == prov, "GROUP"].unique()
    axarr[myplot].set_title(prov)
    for group in groups:
        x = df.loc[(df["GEO"] == prov) & (df["GROUP"] == group), "year"].tolist()
        y = df.loc[(df["GEO"] == prov) & (df["GROUP"] == group), "Value"].tolist()
        axarr[myplot].plot(x, y, label=group)    
    myplot = myplot + 1
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.xlabel('Year')
plt.ylabel('Amount in $')
plt.xlim(2010, 2011)
plt.show()

所以我遇到的问题

1) 尝试将 X 轴设置为显示年份(如 2010 年和 2011 年)而不是 0 - 1

2) 试图让我的图例和轴标签居中(对于子图,这肯定是错误的)。

【问题讨论】:

  • 我不太清楚您对图例的问题,无法回答该部分。你希望它看起来像什么?

标签: python matplotlib plot


【解决方案1】:

以下解决了您的 x 轴问题,并将 Y 轴标签添加到所有绘图。前者是由于在 x 轴上(默认情况下)使用科学记数法,并带有偏移量。这很容易使用set_xticks() 覆盖并删除偏移量。 Y 轴是通过将标签单独应用于每个图来固定的,而不仅仅是最后一个。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

df = pd.DataFrame({
               "GEO": [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3],
               "year": [2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011,2010,2011],
               "GROUP": ['doctor','doctor','Knight','Knight','Wizard','Wizard','doctor','doctor','Knight','Knight','Wizard','Wizard','doctor','doctor','Knight','Knight','Wizard','Wizard'], 
                "Value": random.sample(xrange(100), 18)
})

provs = df["GEO"].unique()
f, axarr = plt.subplots(len(provs), sharex=True, sharey=True)
myplot = 0

for prov in provs:
    groups = df.loc[df["GEO"] == prov, "GROUP"].unique()
    axarr[myplot].set_title(prov)
    for group in groups:
        x = df.loc[(df["GEO"] == prov) & (df["GROUP"] == group), "year"].tolist()
        y = df.loc[(df["GEO"] == prov) & (df["GROUP"] == group), "Value"].tolist()

        axarr[myplot].ticklabel_format(style='plain', useOffset=False)
        axarr[myplot].plot(x, y, label=group)    
        axarr[myplot].set_ylabel('Amount in $')
        axarr[myplot].set_xticks([2010, 2011])

    myplot = myplot + 1


plt.xlabel('Year')  # Only on the final plot (bottom)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

【讨论】: