【问题标题】:Fitting multiple curves or representing in heat map拟合多条曲线或在热图中表示
【发布时间】:2020-06-10 11:22:30
【问题描述】:

我有两列,我试过这个:

df[['EYE_WIDTH','LANE']].groupby(['EYE_WIDTH','LANE']).size().unstack()

现在我得到了这张桌子:

LANE          0      1      2      3      4      5      6      7      8   \
EYE_WIDTH                                                                  
31.2         NaN    NaN    NaN    NaN    NaN    NaN    1.0    NaN    NaN   
35.1         NaN    NaN    NaN    NaN    NaN    1.0    NaN    1.0    NaN   
39.0         NaN    1.0    NaN    2.0    NaN    NaN    2.0    1.0    NaN   
42.9         1.0    5.0    5.0   10.0    2.0    5.0    9.0   17.0    3.0   
46.8        19.0   14.0   17.0   23.0   27.0   31.0   42.0   39.0   27.0   
50.7        84.0   48.0   63.0   93.0   69.0   95.0  137.0  130.0   99.0   
54.6       204.0  173.0  176.0  206.0  158.0  158.0  207.0  182.0  199.0   
58.5       350.0  308.0  296.0  284.0  257.0  214.0  237.0  228.0  235.0   
62.4       282.0  278.0  242.0  257.0  275.0  236.0  259.0  206.0  237.0   
66.3       112.0  180.0  212.0  167.0  213.0  244.0  152.0  223.0  197.0   
70.2        26.0   64.0   65.0   41.0   80.0   91.0   39.0   59.0   76.0   
74.1         2.0   11.0    4.0    1.0    5.0    9.0    2.0    1.0    3.0   
78.0         NaN    NaN    NaN    NaN    NaN    NaN    1.0    NaN    1.0   

LANE          9      10     11     12     13     14     15  
EYE_WIDTH                                                   
31.2         NaN    NaN    NaN    NaN    NaN    NaN    NaN  
35.1         NaN    1.0    NaN    1.0    NaN    NaN    NaN  
39.0         3.0    3.0    3.0    2.0    3.0    6.0    NaN  
42.9        11.0    6.0    7.0    3.0   14.0    7.0    7.0  
46.8        43.0   39.0   41.0   15.0   16.0   29.0   35.0  
50.7       101.0  114.0  144.0   56.0   78.0   96.0  116.0  
54.6       206.0  210.0  193.0  187.0  158.0  186.0  283.0  
58.5       275.0  231.0  246.0  251.0  278.0  295.0  344.0  
62.4       219.0  233.0  217.0  203.0  278.0  257.0  212.0  
66.3       167.0  196.0  163.0  243.0  197.0  161.0   73.0  
70.2        50.0   46.0   58.0   99.0   53.0   40.0   10.0  
74.1         2.0    3.0    5.0   20.0    5.0    4.0    1.0  
78.0         NaN    NaN    NaN    NaN    NaN    NaN    NaN  

现在我想可视化这些关系,我想到的一件事是沿着如下曲线拟合它们 除此之外,如果我也可以在热图中表示它们,那就太好了。

前几行数据

   EYE_WIDTH  LANE
     66.3    11
     58.5    12
     70.2    13
     66.3     7
     58.5    14
     58.5     0
     62.4     1
     62.4     2
     54.6     3
     62.4     4
     58.5     5
     50.7     6
     62.4    15
     66.3     8
     70.2     9
     58.5    10
     66.3     1
     58.5     7
     66.3     8
     50.7     9
     62.4     0
     62.4    11
     62.4    12
     66.3    13
     66.3    15
     58.5    10
     50.7     2
     58.5     3
     54.6     4
     50.7     5
     50.7     6
     58.5    14
     62.4     1
     62.4     2
     62.4     3
     62.4     4
     54.6     5
     62.4     6
     58.5     7
     62.4     8
     66.3     9
     62.4    10
     62.4    11
     62.4    12
     62.4    13
     54.6     0
     66.3    15
     62.4    14
     58.5    15
     54.6    13

所以有 13 个不同的 EYE_WIDTH 值和 16 个不同的 LANE,现在通过使用 groupby 和 size unstack,我知道了每个通道与不同 EYE_WIDTH 关联的次数。现在我需要可视化这种关系

我试过了:

df[['EYE_WIDTH','LANE']].groupby(['EYE_WIDTH','LANE']).size().unstack().plot()

【问题讨论】:

  • 如果您提供更完整的代码(包括导入的库)和文本格式的数据,这将非常有帮助。例如print(df[['EYE_WIDTH','LANE']]) 的输出。你已经尝试了什么?
  • 感谢您的回复。我添加了前 20 行的眼宽和车道。是的,如您在上面看到的,我尝试将它们构建为一个组。现在我被困在可视化它们
  • 请以文本格式,而不是图像。最好不仅仅是 20 行。将print(df[['EYE_WIDTH','LANE']].groupby(['EYE_WIDTH','LANE']).size().unstack()) 的输出作为文本可能会更好。
  • 您至少尝试过thisthis post 之类的方法吗?还是这个blog post
  • 我现在编辑了,够不够

标签: python matplotlib seaborn curve-fitting


【解决方案1】:

嗯,找到数据结构的一种方法是尝试不同的可视化。您从 pandas plot 命令获得的可视化已经表明每个“通道”之间没有太大区别。

这里有一些代码可以绘制给定数据的平滑线图和热图。正如在直线图中,数据似乎没有表明车道参数的影响很大。直线图更“诚实”,因为它只是显示纯数据。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from numpy import NaN
from scipy.interpolate import interp1d

eye_width = [31.2, 35.1, 39.0, 42.9, 46.8, 50.7, 54.6, 58.5, 62.4, 66.3, 70.2, 74.1, 78.0]
rows = np.array([
    [NaN, NaN, NaN, NaN, NaN, NaN, 1.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN],
    [NaN, NaN, NaN, NaN, NaN, 1.0, NaN, 1.0, NaN, NaN, 1.0, NaN, 1.0, NaN, NaN, NaN],
    [NaN, 1.0, NaN, 2.0, NaN, NaN, 2.0, 1.0, NaN, 3.0, 3.0, 3.0, 2.0, 3.0, 6.0, NaN],
    [1.0, 5.0, 5.0, 10.0, 2.0, 5.0, 9.0, 17.0, 3.0, 11.0, 6.0, 7.0, 3.0, 14.0, 7.0, 7.0],
    [19.0, 14.0, 17.0, 23.0, 27.0, 31.0, 42.0, 39.0, 27.0, 43.0, 39.0, 41.0, 15.0, 16.0, 29.0, 35.0],
    [84.0, 48.0, 63.0, 93.0, 69.0, 95.0, 137.0, 130.0, 99.0, 101.0, 114.0, 144.0, 56.0, 78.0, 96.0, 116.0],
    [204.0, 173.0, 176.0, 206.0, 158.0, 158.0, 207.0, 182.0, 199.0, 206.0, 210.0, 193.0, 187.0, 158.0, 186.0, 283.0],
    [350.0, 308.0, 296.0, 284.0, 257.0, 214.0, 237.0, 228.0, 235.0, 275.0, 231.0, 246.0, 251.0, 278.0, 295.0, 344.0],
    [282.0, 278.0, 242.0, 257.0, 275.0, 236.0, 259.0, 206.0, 237.0, 219.0, 233.0, 217.0, 203.0, 278.0, 257.0, 212.0],
    [112.0, 180.0, 212.0, 167.0, 213.0, 244.0, 152.0, 223.0, 197.0, 167.0, 196.0, 163.0, 243.0, 197.0, 161.0, 73.0],
    [26.0, 64.0, 65.0, 41.0, 80.0, 91.0, 39.0, 59.0, 76.0, 50.0, 46.0, 58.0, 99.0, 53.0, 40.0, 10.0],
    [2.0, 11.0, 4.0, 1.0, 5.0, 9.0, 2.0, 1.0, 3.0, 2.0, 3.0, 5.0, 20.0, 5.0, 4.0, 1.0],
    [NaN, NaN, NaN, NaN, NaN, NaN, 1.0, NaN, 1.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN]])

df = pd.DataFrame(data=rows)
df['eye_width'] = eye_width
df.set_index(['eye_width'], inplace=True)
df.fillna(value=0, inplace=True)

fig, (ax, ax2) = plt.subplots(ncols=2, figsize=(12, 4))
x = np.linspace(min(eye_width), max(eye_width), 1000)
for i in range(0, 16, 3):
    # ax.plot(df.index, df[i], label=f'Lane {i}')
    interpolation = interp1d(df.index, df[i], kind='cubic')
    ax.plot(x, interpolation(x), label=f'Lane {i}')
ax.legend(loc='best')

img = ax2.imshow(rows, origin='lower')
ax2.set_xticks(range(16))
ax2.set_yticks(range(len(eye_width)))
ax2.set_yticklabels(eye_width)
plt.colorbar(img, ax=ax2)

plt.tight_layout()
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多