Datetime 散点图的不同颜色渐变取决于时间(Matplotlib)
我有一个数据集,形状如下Datetime 散点图的不同颜色渐变取决于时间(Matplotlib),datetime,matplotlib,data-visualization,scatter-plot,colorbar,Datetime,Matplotlib,Data Visualization,Scatter Plot,Colorbar,我有一个数据集,形状如下 import pandas as pd catalog=pd.read_table("Catalog/MainshockCatalog.txt", sep="\t", names=["Year", "Month", "Day", "Hour", "Min", "Sec",
import pandas as pd
catalog=pd.read_table("Catalog/MainshockCatalog.txt", sep="\t",
names=["Year", "Month", "Day", "Hour", "Min", "Sec", "Lat",
"Lon", "Depth", "Mag"])
catalog
我使用Axes3D
绘制了每个事件的地图,坐标以catalog
DataFrame的Lat
、Lon
和Depth
列给出
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure(figsize=(30, 20))
ax=fig.add_subplot(111, projection='3d')
x=catalog["Lat"]
y=catalog["Lon"]
z=-catalog["Depth"]
ax.scatter(x, y, z, c='k', marker='o', s=50, alpha=0.1, facecolors='none')
ax.scatter(x[0], y[0], z[0], c='b', marker='*', s=1500, label="$M_L$ 5.4 Mainshock")
ax.scatter(x[2395], y[2395], z[2395], c='r', marker='*', s=1500, label="$M_L$ 4.6 Aftershock")
ax.set_xlabel('Latitude ($^\circ$)', fontsize=30, labelpad=30)
ax.set_ylabel('Longitude ($^\circ$)', fontsize=30, labelpad=30)
ax.set_zlabel('Depth (km)', fontsize=30, labelpad=20)
ax.set_zticklabels(['8','7','6','5','4','3','2'])
ax.xaxis.set_tick_params(labelsize=20)
ax.yaxis.set_tick_params(labelsize=20)
ax.zaxis.set_tick_params(labelsize=20)
plt.legend(prop={'size': 30})
plt.show()
结果图如下所示。
在这个图中,每个点的颜色都是相同的。但是,我希望随着相关时间(年
,月
,日
,小时
,分钟
,秒
)随色条的增加而平滑地变化。该示例如下所示(尽管颜色随深度而变化,但本示例中的颜色随时间而变化)
我一直在做一些测试,我已经让它起作用了
目录
数据框上创建一个新列,时间信息采用日期时间
格式。为此,请使用:collect['DateHour']=pd.to_datetime(collect['Year'].astype(str)\
+“/”+collect['Month'].astype(str)+“/”+\
收集['Day'].astype(str)\
+“T”+collect['Hour'].astype(str)+':“+collect['Min'].astype(str)\
“:”+collect['Sec'].astype(str))
2A。通过在ax.scatter
函数的c
参数中指示,您可以使用此新列将其直接绘制为颜色,但它可能不会形成非常漂亮的色条
2B。或者,如果您希望有一个colobar,例如指示与特定日期时间(例如数据中的第一个日期)的时间差(以天为单位),您可以创建一个新的列,只需将collect['DateHour']
列与正确格式化的日期时间实例(或取自collect['DateHour']
)的时间差,然后将时间增量转换为所需的单位,以测量时间增量。您可以查看如何将timedelta64
转换为方便的时间度量。在本例中,它被转换为天:
collect['dt_days']=(collect['DateHour']-pd.to_datetime('2002-02-03T13:56:03.172'))\
/np.timedelta64(1,‘D’)
3B。使用此列,在
ax.scatter的c
参数中指出它。您的建议非常成功。谢谢