【问题标题】:Create scatter plot where the color is based on year without adding extra column创建颜色基于年份而不添加额外列的散点图
【发布时间】:2021-11-23 04:55:06
【问题描述】:

我在 csv 表中有这些数据

TIME X Y
2020-07-03T00:00:00Z 0.08 0.30
2021-07-03T00:00:00Z 0.20 0.12

我想在变量 X 和 Y 之间创建一个散点图,并根据时间上看到的数据的年份为点着色。我知道我可以在其中添加一个包含年份的额外列,但是有没有更优雅的方法可以在不添加列的情况下执行此操作?

【问题讨论】:

  • 您可以使用日期时间获取年份。将此列转换为日期时间,然后使用:df['time'].dt.year 作为参数。

标签: python pandas matplotlib


【解决方案1】:

您可以在不创建额外列的情况下执行此操作,但不会更优雅。 DataFrame.plot.scatter 支持其颜色参数的不同值:

c:str、int 或类似数组,可选

每个点的颜色。可能的值是:

  • 由名称、RGB 或 RGBA 代码引用的单一颜色字符串,例如“red”或“#a98d19”。

  • 由名称、RGB 或 RGBA 代码引用的颜色字符串序列,将递归地用于每个点的颜色。为了 instance ['green','yellow'] 所有点都将被填充为绿色或 黄色,或者。

  • 列名或位置,其值将用于根据颜色图为标记点着色。

所以不要这样做:

df['Year'] = df['TIME'].dt.year
df.plot.scatter('X', 'Y', c='Year')

然后您可以使用 matplotlib 的颜色映射对象手动获取颜色:

def scale_to_unity(s):
    return (s - s.min()) / (s.max() - s.min())

def series_to_colors(s, cmap='viridis'):
    import matplotlib.pyplot as plt
    color_map = plt.get_cmap(cmap)
    return scale_to_unity(s).apply(color_map)

df.plot.scatter('X', 'Y', c=series_to_colors(df.TIME))

和以前一样,您可以只在最后一行使用df.TIME.dt.year 来丢弃精确的时间信息。但是,第一个变体对我来说看起来不那么麻烦。

【讨论】:

  • 我认为您的解决方案同样有效(+1)!也许再长一点,但您已经添加了指定要使用的 cmap 的功能。
【解决方案2】:

根据年份为散点着色的“廉价”方法是直接使用 matplotlib 的 scatter 绘图并将年份作为参数传递给 c parameter of scatter

这是一个最小的例子:

import datetime
import pandas as pd
from matplotlib import pyplot as plt
mydf = pd.DataFrame((
               (datetime.datetime(2020, 1, 1, 23, 00), 0.08, 0.3),
               (datetime.datetime(2021, 2,2,1,2,55), 0.2, 0.12), 
               (datetime.datetime(2022, 2,3,11, 00), 0.12, 0.7)
           ),
           columns=("TIME", 'X', 'Y')
       )

plt.scatter(mydf.X, mydf.Y, c=mydf.TIME.dt.year)

plt.show()

然后您可以使用cmap 参数指定您要应用的颜色图。

【讨论】:

  • +1:啊,太好了; matplotlib 的 scatter 函数再次击败 pandas。在那里,第一个选项“使用 cmap 和 norm 映射到颜色的 n 个数字的标量或序列”。方便地省略。比我的解决方案优雅得多。
【解决方案3】:
c = pd.to_datetime(df.TIME).dt.year
c = c.tolist()
X = df.X
Y = df.Y
plt.scatter(X,Y,c=c)

不必创建列。只需将年份转换为列表,然后您就可以根据列表映射任何颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多