Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-以日期和第三个变量为颜色的散点图_Python_Date_Matplotlib_Scatter - Fatal编程技术网

python-以日期和第三个变量为颜色的散点图

python-以日期和第三个变量为颜色的散点图,python,date,matplotlib,scatter,Python,Date,Matplotlib,Scatter,我正在尝试绘制一个x-y图,使用x或y作为日期变量,并使用第三个变量为点着色。 如果3个变量中没有一个是date,我可以使用: ax.scatter(df['x'],df['y'],s=20,c=df['z'], marker = 'o', cmap = cm.jet ) 搜索之后,我发现对于普通绘图,我们必须使用plot_date()。不幸的是,我无法给这些点上色。 有人能帮我吗 下面是一个小例子: import matplotlib, datetime import matplotlib.

我正在尝试绘制一个x-y图,使用x或y作为日期变量,并使用第三个变量为点着色。 如果3个变量中没有一个是date,我可以使用:

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()
您可以用xAlt替换df['x'],以查看所需的结果


谢谢

据我所知,必须使用
分散
才能按照您的描述对点进行着色。一种解决方法是使用
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刻度中的
xAlt
->
df['x']
。这将生成一个在x轴上带有时间的绘图,并且点由第三个数组着色。您是否尝试运行上面的代码段?您不能使用
scatter
df['x']
,因此您需要使用我建议的解决方法。好的,我知道了!非常感谢-没问题。如果你能接受我的答案,如果它能解决你的问题,我将不胜感激。好的,我给出的例子适用于任何时间列表(假设你想要小时:分钟作为格式,但这很容易改变)