我有以下数据:
import pandas as pd import numpy as np # Generate dummy data. a = np.random.random(75) b = np.random.random(75) - 0.6 c = np.random.random(75) + 0.75 # Collate into a DataFrame df = pd.DataFrame({'a': a, 'b': b, 'c': c}) df.columns = [list(['WT', 'MUT', 'WTxMUT']), list(['Parent', 'Parent', 'Offspring'])] df.columns.names = ['Genotype', 'Status'] df_melt = pd.melt(df)
我使用以下代码将其绘制在seaborn中:
import seaborn as sb sb.swarmplot(data = df_melt, x = "Status", y = "value", hue = "Genotype")
如何获得每个组的X跨度?例如,父组的swarmplot的水平跨度的范围是多少?
您可以从中collections创建的信息swarmplot。
collections
swarmplot
swarmplot实际返回matplotlibAxes实例,然后从那里可以找到PathCollections它创建的实例。要获取职位,我们可以使用.get_offsets()。
Axes
PathCollections
.get_offsets()
这是您的示例,进行了修改以查找并打印群限制,然后使用它们在群周围绘制方框。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sb from matplotlib.patches import Rectangle # Generate dummy data. a = np.random.random(75) b = np.random.random(75) - 0.6 c = np.random.random(75) + 0.75 # Collate into a DataFrame df = pd.DataFrame({'a': a, 'b': b, 'c': c}) df.columns = [list(['WT', 'MUT', 'WTxMUT']), list(['Parent', 'Parent', 'Offspring'])] df.columns.names = ['Genotype', 'Status'] df_melt = pd.melt(df) ax = sb.swarmplot(data = df_melt, x = "Status", y = "value", hue = "Genotype") def getdatalim(coll): x,y = np.array(coll.get_offsets()).T try: print 'xmin={}, xmax={}, ymin={}, ymax={}'.format( x.min(), x.max(), y.min(), y.max()) rect = Rectangle((x.min(),y.min()),x.ptp(),y.ptp(),edgecolor='k',facecolor='None',lw=3) ax.add_patch(rect) except ValueError: pass getdatalim(ax.collections[0]) # "Parent" getdatalim(ax.collections[1]) # "Offspring" plt.show()
打印:
xmin=-0.107313729132, xmax=0.10661092707, ymin=-0.598534246847, ymax=0.980441247759 xmin=0.942829146473, xmax=1.06105941656, ymin=0.761277608688, ymax=1.74729717464
这是图: