散点图的不同颜色渐变取决于时间(Matplotlib)

Different color gradation for scatter plot depending on time (Matplotlib)

我有一个形状如下所示的数据集。

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 的 LatLonDepth 列给出.

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()

生成的图如下所示。

在这个图中,每个点的颜色都是一样的。但是,我希望它与相关时间的渐变平滑地不同(YearMonthDayHourMinSec ) 随着颜色条的增加而增加。该示例如下所示(尽管颜色随深度变化,而不是此示例的时间)。

我一直在做一些测试,我已经让它工作了。

  1. 使用 datetime 格式的时间信息在 catalog 数据框上创建一个新列。为此,请使用 pd.to_datetime:
collect['DateHour'] =  pd.to_datetime(collect['Year'].astype(str) \
+ '/' + collect['Month'].astype(str) + '/' + \
collect['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']),然后将时间增量转换为所需的单位以测量时间增量。您可以查看 here some examples 如何将 timedelta64 转换为方便的时间度量。在此示例中,它被转换为天数:

collect['dt_days'] = (collect['DateHour']-pd.to_datetime('2002-02-03T13:56:03.172')) \
/ np.timedelta64(1, 'D')

3B。通过在 ax.scatter

c 参数中指明来使用此列