python 3 pandas和seaborn使用swarmplot进行斗争-multiIndex
Posted
技术标签:
【中文标题】python 3 pandas和seaborn使用swarmplot进行斗争-multiIndex【英文标题】:python 3 pandas and seaborn struggle using swarmplot - multiIndex 【发布时间】:2016-07-21 10:16:25 【问题描述】:我很难让swarmplot
与pandas
一起工作。我有一个名为 SIAggs 的 3d numpy
array
,我使用 pandas
将其切片,如下所示:
rand_center = ('Random_dist'):SIAggs[:,:,1], ('Center_distance'):SIAggs[:,:,0]
for key, value in rand_center.items():
rand_center[key] = pd.DataFrame(value)
sizes =
for i in range(size_iterations):
sizes.update( (str(i+1)) : SIAggs[i,:,:] )
for key, value in sizes.items():
sizes[key] = pd.DataFrame(value)
df = pd.concat(sizes, rand_center, names = ['sizes', 'distance_measure'])
df.stack()
当我打印 DataFrame
给我时:
sizes 1 2 3
distance_measure 0 1 0 1 0 1
0 -2.1881 1.262 -2.7001 1.493 -2.1381 1.626
1 -2.3671 1.699 -2.4431 1.208 -2.4571 1.186
2 -2.3071 0.716 -2.2841 1.122 -2.2441 1.396
3 -2.2521 0.967 -1.9451 1.496 -2.5261 1.690
4 -2.4651 1.800 -2.3421 1.500 -2.3571 0.985
5 -2.2011 1.409 -1.9921 0.160 -2.3701 1.114
6 -2.6911 0.915 -3.3301 1.510 -2.2561 1.676
7 -2.5751 1.128 -1.9931 0.941 -2.4411 1.605
8 -2.5321 1.651 -2.4751 1.145 -3.3541 1.228
9 -1.9741 0.886 -2.6671 1.196 -2.4581 1.321
这似乎是对的。
然后,当我尝试用swarmplot
绘制它时,我想要一个配对的Series
(按我的sizes
类别)(使用distance_measure
的色调差异) - 基本上只是使用@ 中的第5 个示例987654321@
ax = sns.swarmplot(x = "sizes", hue = "distance_measure", data = df, split=True)
plt.show()
抛出一个错误:
ax = sns.swarmplot(x = "sizes", hue = "distance_measure", data = df, split=True)
File "/Users/scottjg/anaconda/lib/python3.5/site-packages/seaborn/categorical.py", line 2679, in swarmplot
split, orient, color, palette)
File "/Users/scottjg/anaconda/lib/python3.5/site-packages/seaborn/categorical.py", line 1179, in __init__
self.establish_variables(x, y, hue, data, orient, order, hue_order)
File "/Users/scottjg/anaconda/lib/python3.5/site-packages/seaborn/categorical.py", line 147, in establish_variables
raise ValueError(err)
ValueError: Could not interpret input 'sizes'
任何帮助将不胜感激。我似乎无法与 pandas/seaborn 交朋友,但我想!
【问题讨论】:
【参考方案1】:以下是生成您似乎正在寻找的图表的尝试,从您的示例数据开始:
df = pd.read_csv('swarm.csv', header=[0, 1], tupleize_cols=True, index_col=None)
cols = ['sizes', 'distance_measure']
df.columns = pd.MultiIndex.from_tuples(df.columns, names=cols)
sizes 1 2
distance_measure 0 1 0
0 -2.1881 1.262 -2.7001
1 -2.3671 1.699 -2.4431
2 -2.3071 0.716 -2.2841
3 -2.2521 0.967 -1.9451
4 -2.4651 1.800 -2.3421
用于 seaborns 演示的示例数据在不同的列中包含变量,而不是使用 MultiIndex
,因此我正在相应地转换:
df = df.stack(cols).reset_index(cols).rename(columns=0: 'value')
df.info()
Int64Index: 30 entries, 0 to 9
Data columns (total 3 columns):
sizes 30 non-null object
distance_measure 30 non-null object
value 30 non-null float64
df.head()
sizes distance_measure value
0 1 0 -2.1881
0 1 1 1.2620
0 2 0 -2.7001
1 1 0 -2.3671
1 1 1 1.6990
然后,下面的代码会生成类似于示例 #5 的内容:
ax = sns.swarmplot(x="sizes", y='value', hue="distance_measure", data=df, split=True)
plt.show()
【讨论】:
非常感谢@stefan-jansen。它既解决了我的问题,也教了我为什么它不起作用。非常感谢。 令人沮丧的是,seaborn 没有“获取”多索引数据框,因为它看起来更直观且更高效。 我想这是为开源付出代价的一部分——很少完美,但总是在改进。不过我想说,这是一个相当不错的软件包,而且pandas
数据操作工具一旦您熟练使用它们,这些调整就会变得非常可行。
确实——我没有抱怨!!我还在努力提高熊猫的学习曲线(你帮了很多忙!)以上是关于python 3 pandas和seaborn使用swarmplot进行斗争-multiIndex的主要内容,如果未能解决你的问题,请参考以下文章