Python 创建函数为列中的每个唯一值绘制多个分布图

Python 创建函数为列中的每个唯一值绘制多个分布图,python,function,for-loop,matplotlib,seaborn,Python,Function,For Loop,Matplotlib,Seaborn,我正在努力解决这个问题。 我需要这个函数为列中的每个唯一值绘制X个seaborn显示数(在单独的图中)。 在下面的示例中,我使用的是转换为数据帧的iris数据集,其中添加了三列:city、color、period import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from scipy import stats from matplotlib import rcP

我正在努力解决这个问题。 我需要这个函数为列中的每个唯一值绘制X个seaborn显示数(在单独的图中)。 在下面的示例中,我使用的是转换为数据帧的iris数据集,其中添加了三列:
city
color
period

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()

到目前为止,这段代码能够绘制我定义的两个由X变量分割的度量值(在本例中为
期间
)。 假设现在我希望看到完全相同的输出(相同的测量值,并按
期间
划分),但对于
城市
列中的每个值,将生成一个新的绘图/图形。当然,我可以通过一次过滤一个值来手动执行此操作,但是如果
city
有50个唯一值,我需要一个函数来迭代并绘制50个单独的分布

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

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

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

您的意思是想要50个单独的图吗(每个城市一份,按时段分割)?或者您希望在同一地块中分配50份(每个城市一份,不按时段分割)

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

对于期间,在df.groupby('period')中分组:
distplot(组[[r'花瓣宽度(cm)]],hist=False,label=f'花瓣:{period}'))
分离图(组[[r'萼片宽度(cm)”],hist=False,label=f'萼片:{period}'))
plt.legend()
您还可以设置
sns.distplot
color
参数,以选择所需的颜色,但对于50个绘图,您可能需要查看

编辑:

现在你想要什么就更清楚了,你可以试试这样的

def plot\u city(城市名称、数据):
“”“为一个城市生成绘图”“”
措施={
‘花瓣宽度(厘米)’‘标签:橙色’,
'萼片宽度(厘米)''标签:蓝色',
}
线条样式={
'在':'-'之前,
'在':'-'之后,
}
图,ax=plt.子批次(图尺寸=(12,9))
对于测量,测量中的颜色。项目()
对于期间,在数据中分组。groupby(“期间”):
sns.distplot(
ax=ax,
a=组[测量],
hist=False,
label=f'petal:{period}',
颜色=颜色,
kde_kws={'linestyle':线条样式[period]}
)
ax.set_title(城市名称,fontsize=24)
ax.setxlabel('width(cm)”,fontsize=18)
plt.图例(fontsize=18)
返回图
对于城市名称,df.groupby(“城市”)中的数据:
图=绘图城市(城市名称、数据)
图.savefig(f./{city_name}.png',bbox_inches='tight')
plt.show()

看看本期末尾提出的FacetGrid解决方案(带有图像的解决方案):.我无法想象一个50个分布相互叠加的图有多大的实用性。你可能想重新考虑可视化。谢谢,这实际上似乎比我现在用“period”变量拆分的方式更有效。但我要寻找的是为每个
城市
变量生成50个单独的数字(不在同一个图中)。那么您的图像非常混乱。请查看主文档,这是它的预期用途。在页面中搜索“Wrap”一个具有多个级别的列变量到行中:我想要50个独立的绘图-每个城市一个,但仍然按
周期
列分割。groupby工作得很好,谢谢。虽然我已经尝试添加颜色选项,但由于每个度量值按周期分割,我得到了同一图形的2种颜色,这是我不想要的。我将查看颜色贴图。我编辑了我的答案。这将节省50不同的绘图。或者,您可以使用
plt.subplot(nrows=5,ncols=10)将它们全部放在一个包含50个子绘图的巨大绘图上。
非常感谢,这似乎正好满足了我的需要。