【问题标题】:Grid of plots with lines overplotted in matplotlib在 matplotlib 中过度绘制线条的绘图网格
【发布时间】:2020-08-15 05:26:33
【问题描述】:

我有一个数据框,其中包含一堆 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 类似或更直观的方法来使用。

【问题讨论】:

标签: python pandas numpy matplotlib


【解决方案1】:

您可以使用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');

给予:

或手动pltgroupby

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

给予:

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2021-01-07
    • 2022-11-10
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多