创建函数以为列

时间:2019-07-16 23:04:38

标签: python function for-loop matplotlib seaborn

我正在为此功能而苦苦挣扎。 我需要此函数要做的是,为一列中的每个唯一值绘制X个海洋深处的探究数量(在单独的图中)。 在下面的示例中,我使用的是将虹膜数据集转换为添加了三个附加列的数据框:citycolorperiod

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
from matplotlib import rcParams
from sklearn.datasets import load_iris

iris=load_iris()
df=pd.DataFrame(data= np.c_[iris['data'], iris['target']],columns= iris['feature_names'] + ['target'])

df['city']=np.random.choice(['New York','Paris','London'],size=len(df))
df['period']=np.random.choice(['before','after'],size=len(df))
df['color']=np.random.choice(['red','black','blue'],size=len(df))

unique_vals = df['period'].unique()
targets = [df.loc[df['period'] == val] for val in unique_vals]
for target in targets:
    sns.distplot(target[[r'petal width (cm)']], hist=False,label='shouldbedynamic')
    sns.distplot(target[[r'sepal width (cm)']], hist=False,label='shouldbedynamic')
    plt.legend()

plt.show()

Snippet of the above output

到目前为止,这段代码可以绘制我定义的两个由X变量(在这种情况下为period)划分的度量。 假设现在我想查看完全相同的输出(相同的度量并用period进行划分),但是对于city列中的每个值,将是一个新的图/图产生。我当然可以通过一次过滤一个值来手动完成此操作,但是在city具有50个唯一值的情况下,我需要一个函数来遍历并绘制50个单独的分布。

除此之外,我还有两个较小的问题

  • 如何在现有代码中设置label选项以动态生成图例,以显示彩色线条代表什么?
  • 类似的问题:是否可以在现有功能范围内将色线设置为另一种颜色?

编辑:只想弄清楚我想要的是能够在单独的图中绘制分布(而不是在同一图中)。因此,如果city具有50个不同的值,则图片中的相同数字将为每个城市的数据生成:纽约,巴黎,伦敦等

1 个答案:

答案 0 :(得分:0)

您是说要50个单独的地块(每个城市一个地块,并按时期划分)吗?还是要在同一地块中分配50个(每个城市一个,而不是按时期划分)?

获取动态标签非常容易,只需使用groupby而不是unique

for period, group in df.groupby('period'):
    sns.distplot(group[[r'petal width (cm)']], hist=False, label=f'petal: {period}')
    sns.distplot(group[[r'sepal width (cm)']], hist=False, label=f'sepal: {period}')

plt.legend() 

您还可以设置color的{​​{1}}参数以选择所需的任何颜色,但是在50个绘图中,您可能希望查看colormaps

编辑:

现在,您想要的更加清楚了,您可以尝试这样的操作

sns.distplot