我有一个数据框,它由一堆x,y数据组成,我想用散点形式和一条线一起看。数据框由多个类别的数据组成,其形式重复。我想看到的最终结果是某种网格的图,但我并不完全清楚matplotlib如何处理多图数据的子图。
下面是一个我正在处理的数据的例子。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
category = np.arange(1,10)
total_data = pd.DataFrame()
for i in category:
x = np.arange(0,100)
y = 2*x + 10
data = np.random.normal(0,1,100) * y
dataframe = pd.DataFrame({'x':x, 'y':y, 'data':data, 'category':i})
total_data = total_data.append(dataframe)
我们有x数据,我们有y数据,这是某种生成数据集(数据变量)的线性模型。
我已经能够根据主数据集的子集生成单独的图,但在这种情况下,我想看到它们都并排在一个3x3网格中。然而,在循环中调用这些图只是将它们全部重绘到一张图像上。
有什么好的方法可以把下面的代码块用类别子集做一个网格吗?我在绘图内调用子集是否过于复杂?
plt.scatter(total_data['x'][total_data['category']==1], total_data['data'][total_data['category']==1])
plt.plot(total_data['x'][total_data['category']==1], total_data['y'][total_data['category']==1], linewidth=4, color='black')
如果有更简单的方法来生成按类别的散点加线,我很赞成。我不知道seaborn是否有类似的或者比pyplot更直观的方法可以使用。
你可以使用以下两种方法 sns.FacetGrid
或手动 plt.plot
. 例如:
g = sns.FacetGrid(data=total_data, col='category', col_wrap=3)
g = g.map(plt.scatter, 'x','data')
g = g.map(plt.plot,'x','y', color='k');
给予:
或手动 plt
与 groupby
:
fig, axes = plt.subplots(3,3)
for (cat, data), ax in zip(total_data.groupby('category'), axes.ravel()):
ax.scatter(data['x'], data['data'])
ax.plot(data['x'], data['y'], color='k')
给予: