【问题标题】:python - scatter plot with dates and 3rd variable as colorpython - 以日期和第三个变量为颜色的散点图
【发布时间】:2017-01-29 10:31:23
【问题描述】:

我正在尝试绘制一个 x-y 图,其中 x 或 y 作为日期变量,并使用第三个变量为点着色。 如果 3 个变量都不是日期,我设法做到了,使用:

ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet )

经过搜索,我发现对于正常的情节,我们必须使用 plot_date()。不幸的是,我无法为这些点着色。 有人可以帮帮我吗?

这是一个小例子:

import matplotlib, datetime
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import pandas as pd

todayTime=datetime.datetime.now();
df = pd.DataFrame({'x': [todayTime+datetime.timedelta(hours=i) for i in range(10)], 'y': range(10),'z' : [2*j for j in range(10)]});
xAlt=[0.5*i for i in range(10)];

fig, ax = plt.subplots()
ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet )
plt.show()

您可以将 df['x'] 替换为 xAlt 以查看所需的结果

谢谢

【问题讨论】:

    标签: python date matplotlib scatter


    【解决方案1】:

    据我所知,必须使用scatter 才能为您描述的点着色。一种解决方法是使用 FuncFormatter 将刻度标签转换为 x 轴上的时间。下面的代码将日期转换为数字,制作散点图,并使用FuncFormatter 将刻度标签转换回日期。

    import matplotlib, datetime
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import pandas as pd
    from matplotlib.ticker import FuncFormatter
    
    todayTime=datetime.datetime.now()
    df = pd.DataFrame({'x': [todayTime+datetime.timedelta(hours=i) for i in  range(10)], 'y': range(10),'z' : [2*j for j in range(10)]})
    
    def my_formatter(x, pos=None):
        d = matplotlib.dates.num2date(x)
        if len(str(d.minute)) == 1:
            mn = '0{}'.format(d.minute)
        else:
            mn = str(d.minute)
        if len(str(d.hour)) == 1:
            hr = '0{}'.format(d.hour)
        else:
            hr = str(d.hour)
        return hr+':'+mn
    
    major_formatter=FuncFormatter(my_formatter)
    
    nums = np.array([matplotlib.dates.date2num(di) for di in df['x']])
    
    fig, ax = plt.subplots()
    ax.xaxis.set_major_formatter(major_formatter)
    ax.scatter(nums,df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet )
    xmin = df['x'][0]-datetime.timedelta(hours=1)
    xmax = df['x'][len(df['x'])-1]+datetime.timedelta(hours=1)
    ax.set_xlim((xmin,xmax))
    plt.show()
    

    【讨论】:

    • 感谢您的回答。不幸的是,这不是我所期望的。它已经适用于 xAlt。我想做: ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet )
    • 重点是使用xAlt 进行绘图,然后使用my_formatter 函数在x-ticks 中转换xAlt -> df['x']。这应该会在 x 轴上生成一个带有时间的图,并用第三个数组着色的点。你试过运行上面的代码 sn-p 吗?您不能使用scatterdf['x'],因此您需要使用我建议的解决方法。
    • 好的,我知道了!非常感谢
    • 很好 - 没问题。如果您接受了我的回答,如果它解决了您的问题,我将不胜感激。
    • 好吧,我给出的例子应该适用于任何时间列表(假设你想要小时:分钟作为格式,但这很容易改变)
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    相关资源
    最近更新 更多