AttributeError:“GrouperView”对象没有属性“join”

AttributeError: 'GrouperView' object has no attribute 'join'

提问人:Mario 提问时间:11/4/2023 最后编辑:Goku - stands with PalestineMario 更新时间:11/4/2023 访问量:227

问:

我正在尝试重现此答案,但出现以下错误:

AttributeError:“GrouperView”对象没有属性“join”

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[283], line 7
      4 flights = flights.pivot("month", "year", "passengers")
      5 f,(ax1,ax2,ax3, axcb) = plt.subplots(1,4, 
      6             gridspec_kw={'width_ratios':[1,1,1,0.08]})
----> 7 ax1.get_shared_y_axes().join(ax2,ax3)
      8 g1 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax1)
      9 g1.set_ylabel('')

AttributeError: 'GrouperView' object has no attribute 'join'

此外,版本如下:

print(sns.__version__) #0.13.0
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__) #matplotlib: 3.8.1)

我检查了一些解决方法,但无法解决绘图中的问题,因为打印时没有真正的字符串:ax2,ax3

即使我降级了seaborn,但并没有基于这个线程解决问题

Seaborn Python python-3.x 热图 属性错误

评论


答:

1赞 Goku - stands with Palestine 11/4/2023 #1

解决方案:请将 matplotlib 降级到 3.7 或 3.6

你的错误与seaborn无关。

由于 matplotlib,您收到此错误:

当我将 matplotlib 升级到 .我收到此错误:3.8.1

AttributeError: 'GrouperView' object has no attribute 'join'

此外,我在 matplotlib 3.6 中收到弃用警告

MatplotlibDeprecation警告:join 函数在 Matplotlib 3.6 中已弃用,将在两个次要版本后删除。

我能够在 matplotlib 3.6 和 3.7 中重现该图形

代码如下:

import seaborn  as sns
import matplotlib.pyplot as plt
flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
f,(ax1,ax2,ax3, axcb) = plt.subplots(1,4, 
            gridspec_kw={'width_ratios':[1,1,1,0.08]})
ax1.get_shared_y_axes().join(ax2,ax3)
g1 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax1)
g1.set_ylabel('')
g1.set_xlabel('')
g2 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax2)
g2.set_ylabel('')
g2.set_xlabel('')
g2.set_yticks([])
g3 = sns.heatmap(flights,cmap="YlGnBu",ax=ax3, cbar_ax=axcb)
g3.set_ylabel('')
g3.set_xlabel('')
g3.set_yticks([])

# may be needed to rotate the ticklabels correctly:
for ax in [g1,g2,g3]:
    tl = ax.get_xticklabels()
    ax.set_xticklabels(tl, rotation=90)
    tly = ax.get_yticklabels()
    ax.set_yticklabels(tly, rotation=0)

plt.show()

enter image description here

2赞 BigBen 11/4/2023 #2

正如 3.6 API 更改中建议的那样(并在 3.8 API 更改中重复),请使用 Axes.sharey

ax1.sharey(ax2)
ax2.sharey(ax3)

由于只能与另一个人共享,我不知道有一种替代方案可以一步与两者共享。AxesshareyAxesax1ax2ax3