Python matplotlib / Seaborn stripplot带点间连接

5ktev3wc  于 2023-10-24  发布在  Python
关注(0)|答案(2)|浏览(115)

我使用Python 3和Seaborn来制作分类条带图(请参见下面的代码和图片)。
每个条带图有2个数据点(每个性别一个)。

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

df = [["city2", "f", 300],
    ["city2", "m", 39],
    ["city1", "f", 95],
    ["city1", "m", 53]]

df = pd.DataFrame(df, columns = ["city", "gender", "variable"])

sns.stripplot(data=df,x='city',hue='gender',y='variable', size=10, linewidth=1)

我得到以下输出x1c 0d1x
然而,我希望有一个线段连接男性和女性点。我希望图看起来像这样(见下图)。然而,我手动画了那些红线,我想知道是否有一个简单的方法来做w/ Seaborn或matplotlib。谢谢!

5vf7fwbs

5vf7fwbs1#

您可以使用pandas.dataframe.groupby创建f-m对的列表,然后绘制对之间的分段:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import collections  as mc
import pandas as pd
import seaborn as sns

df = [["city2", "f", 300],
      ["city2", "m", 39],
      ["city1", "f", 95],
      ["city1", "m", 53],
      ["city4", "f", 200],
      ["city3", "f", 100],
      ["city4", "m", 236],
      ["city3", "m", 20],]

df = pd.DataFrame(df, columns = ["city", "gender", "variable"])

ax = sns.stripplot(data=df,x='city',hue='gender',y='variable', size=10, linewidth=1)

lines = ([[x, n] for n in group] for x, (_, group) in enumerate(df.groupby(['city'], sort = False)['variable']))
lc = mc.LineCollection(lines, colors='red', linewidths=2)    
ax.add_collection(lc)

sns.plt.show()

输出:

yduiuuwa

yduiuuwa2#

只是为了给这个添加一个小东西,以便将来保存某人的时间。这个解决方案对我有效,但你会注意到,在某些情况下,垂直线与圆圈标记并不完全对齐。据我所知,其原因与figsize和dpi有关(不是xtick范围)。如果您将保存的.png图形版本与GUI中显示/生成的版本进行比较,(在我的例子中是Spyder),您可以看到它们是不同的,并且.png文件具有正确对齐的标记和线条。

相关问题