gpt4 book ai didi

python - Pandas 箱线图中共享轴的不同 ylim

转载 作者:太空狗 更新时间:2023-10-29 21:36:25 25 4
gpt4 key购买 nike

我有一个分组的 pandas 箱线图,排列在 (2,2) 网格中:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
bp = df.boxplot(by="models",layout=(2,2),figsize=(6,8))
plt.show()

enter image description here

我现在只想更改第二行的 ylim

我的想法是添加:

[ax_tmp.set_ylim(-10,10) for ax_tmp in np.asarray(bp).reshape(-1)[2:4]]

[ax_tmp.set_ylim(-10,10) for ax_tmp in np.asarray(bp)[1,:]]

但它们都改变了所有子图的 ylim。这可能是因为 sharedy。但我不知道要摆脱它。

我的问题与这个有点相关:pandas boxplot, groupby different ylim in each subplot但在我看来不是重复的。此外,该解决方案在这里也不容易应用。

更新:理想情况下,行应该共享一个共同的 y,而不是每个图都有自己的

最佳答案

解决方案是将 fig,axes 传递给使用 sharey=False 自定义的 pandas 的 boxplot:

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

df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
fig, ax_new = plt.subplots(2,2, sharey=False)
bp = df.boxplot(by="models",ax=ax_new,layout=(2,2),figsize=(6,8))
[ax_tmp.set_xlabel('') for ax_tmp in ax_new.reshape(-1)]
[ax_tmp.set_ylim(-2, 2) for ax_tmp in ax_new[1]]
fig.suptitle('New title here')
plt.show()

结果:

enter image description here

如果你想按行共享。此代码适合您:

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

df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
layout = [2,2]
fig = plt.figure()
all_axes = []
counter = 1
for i in range(layout[0]):
tmp_row_axes = []
for j in range(layout[1]):
if j!=0 :
exec "tmp_row_axes.append(fig.add_subplot(%d%d%d, sharey=tmp_row_axes[0]))"%(layout[0],layout[1],counter)
else:
exec "tmp_row_axes.append(fig.add_subplot(%d%d%d))" % (layout[0], layout[1], counter)
counter+=1
all_axes.append(tmp_row_axes)
all_axes = np.array(all_axes)
bp = df.boxplot(by="models",ax=np.array(all_axes),layout=(2,2),figsize=(6,8))
[ax_tmp.set_xlabel('') for ax_tmp in all_axes.reshape(-1)]
all_axes[1][0].set_ylim(-2,2)
fig.suptitle('New title here')
plt.show()

如您所见,使用 all_axes[1][0].set_ylim(-2,2) 仅更改第二行中第一个轴的 ylim,整行都会更改。 all_axes[1][1].set_ylim(-2,2) 会做同样的事情,因为它们有一个共享的 y 轴。

enter image description here

如果你只想要最后一行的 x 轴和第一列的 y 轴标签,只需将循环更改为:

for i in range(layout[0]):
tmp_row_axes = []
for j in range(layout[1]):
if j!=0 :
exec "tmp_ax = fig.add_subplot(%d%d%d, sharey=tmp_row_axes[0])"%(layout[0],layout[1],counter)
tmp_ax.get_yaxis().set_visible(False)
else:
exec "tmp_ax=fig.add_subplot(%d%d%d)" % (layout[0], layout[1], counter)
if i!=layout[1]-1 :
tmp_ax.get_xaxis().set_visible(False)
tmp_row_axes.append(tmp_ax)
counter+=1
all_axes.append(tmp_row_axes)

结果:

enter image description here

关于python - Pandas 箱线图中共享轴的不同 ylim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40148830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com