【问题标题】:Find the highest value of y for each x value and connect the points with a line为每个 x 值找到 y 的最大值,并用一条线连接这些点
【发布时间】:2021-10-02 22:25:48
【问题描述】:

我正在探索最好的方法。

我有一个 y 与 x 的散点图,其中 x 是人均收入。

在将所有值绘制为散点图后,我想为每个 x 值(即在每个收入水平)找到 y 的最高值,然后用一条线连接这些点。

如何在 Python 中做到这一点?

【问题讨论】:

  • 这个问题与matplotlib无关。您绘制的数据结构是什么?
  • @DYC 我有两列数据。一个用于 y 值,一个用于 x 值。我想我可以创建一个散点图。但我被困在第二阶段:找出每个 x 值的最高 y 值,然后用一条线连接这些点。

标签: python numpy matplotlib graph


【解决方案1】:

您可以使用pandas,因为它有一个方便的groupby 方法并且可以很好地与matplotlib 配合使用:

import pandas as pd

# example data
df = pd.DataFrame({'x': [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
                   'y': [3, 7, 9, 4, 1, 2, 8, 6, 4, 4, 3, 1]})

# standard scatter plot
ax = df.plot.scatter('x', 'y')

# find max. y value for each x
groupmax = df.groupby('x').max()

# connect max. values with lines
groupmax.plot(ax=ax, legend=False);

【讨论】:

    【解决方案2】:

    您有两个并行列表:xy。您想按x 将它们分组,并在y 中取最大值。首先,您应该将列表排序在一起。将它们压缩成一个元组列表并排序:

    xy = sorted(zip(x, y))
    

    现在,按第一个元素(“x”)对排序列表进行分组。结果是一个元组列表,其中第一个元素是 x,第二个元素是具有该 x 的所有点的列表。自然,每个点也是一个元组,每个元组的第一个元素都是同一个x:

    from itertools import groupby
    grouped = groupby(xy, lambda item: item[0])
    

    最后,取每组点的 x 和最大值:

    envelope = [(xp, max(points)[1]) for xp, points in grouped]
    

    envelope 是包含散点图的xy 元组列表。你可以进一步解压成xs和ys:

    x1, y1 = zip(*envelope)
    

    把它们放在一起:

    x1, y1 = zip(*[(xp, max(points)[1]) 
                   for xp, points 
                   in groupby(sorted(zip(x, y)), lambda item: item[0])])
    

    【讨论】:

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