0

我有一个 pandas 数据框,region其中包含英国各地区随时间推移的公寓 ( Flat) 和独立房产 ( Detached) 的价格(列Month)。我正在尝试获取公寓和独立物业的价格随时间变化的图,以便这些图有两个不同的 y 轴 - 都是平均价格,但比例不同。

我已经通过使用实现了这一点twinx(),但是使用下面的代码我显然得到了两个数字。这些数字中的第一个正是我想要的,但是我得到了第二个空白图。我在下面附上了我想要的那种情节的截图。

删除第二条无花果线fig, ax2 = ...时,出现错误NameError: name 'ax2' is not defined。将线带ax2 = ax.twinx()出循环也会产生错误AttributeError: 'numpy.ndarray' object has no attribute 'twinx'。如果没有重复的空白图形,我似乎无法弄清楚如何让这个情节工作,非常感谢任何帮助。

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

region_list = sorted(region['Area'].unique().tolist())

fig, ax = plt.subplots(nrows=len(region_list), figsize=(13.8,len(region_list)*7))
fig, ax2 = plt.subplots(nrows=len(region_list), figsize=(13.8,len(region_list)*7))

for i in region_list:
    ind = region_list.index(i)
    filt = region['Area'] == i
    ax2[ind] = ax[ind].twinx()
    ax[ind].plot(region.loc[filt]['Month'],region.loc[filt]['Flat'], color='red', marker='o')
    ax[ind].set_ylabel('Average price of flats', color='red', fontsize=14)
    ax2[ind].plot(region.loc[filt]['Month'],region.loc[filt]['Detached'],color='blue',marker='o')
    ax2[ind].set_ylabel('Average price of detached properties',color='blue',fontsize=14)
    ax[ind].set_title(i, size=14)
    ax[ind].xaxis.set_tick_params(labelsize=10)
    ax[ind].yaxis.set_tick_params(labelsize=10)

plt.tight_layout()

阴谋

4

1 回答 1

0

为子图创建辅助轴时,结果是一个新对象,并且不能使用像子图轴这样的数组索引来引用(除非您专门将新的双轴添加到数组中)。

您可能已经看过以下内容:

# with one axis
fig, ax = plt.subplots()
ax2 = ax.twinx()
ax2.plot(...)

但是对于多个子图,同样的逻辑适用:

# with one axis
fig, axes = plt.subplots(1, 2)

ax2 = axes[0].twinx()
ax2.plot(...) # secondary axis on subplot 0

ax2 = axes[1].twinx()
ax2.plot(...) # secondary axis on subplot 1

在你的情况下:

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

region_list = sorted(region['Area'].unique().tolist())

fig, ax = plt.subplots(nrows=len(region_list), figsize=(13.8,len(region_list)*7))

# don't add a second plot - this would be blank
# fig, ax2 = plt.subplots(nrows=len(region_list), figsize=(13.8,len(region_list)*7))

for i in region_list:
    ind = region_list.index(i)
    filt = region['Area'] == i

    # don't index into ax2
    # ax2[ind] = ax[ind].twinx()

    # instead, create a local variable ax2 which is the secondary axis
    # on the subplot ax[ind]
    ax2 = ax[ind].twinx()

    ax[ind].plot(region.loc[filt]['Month'],region.loc[filt]['Flat'], color='red', marker='o')
    ax[ind].set_ylabel('Average price of flats', color='red', fontsize=14)
    ax2.plot(region.loc[filt]['Month'],region.loc[filt]['Detached'],color='blue',marker='o')
    ax2.set_ylabel('Average price of detached properties',color='blue',fontsize=14)
    ax[ind].set_title(i, size=14)
    ax[ind].xaxis.set_tick_params(labelsize=10)
    ax[ind].yaxis.set_tick_params(labelsize=10)

plt.tight_layout()
于 2021-11-06T20:21:23.583 回答