散点图的不同颜色渐变取决于时间(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 的 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()
生成的图如下所示。
在这个图中,每个点的颜色都是一样的。但是,我希望它与相关时间的渐变平滑地不同(Year
、Month
、Day
、Hour
、Min
、Sec
) 随着颜色条的增加而增加。该示例如下所示(尽管颜色随深度变化,而不是此示例的时间)。
我一直在做一些测试,我已经让它工作了。
- 使用
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
参数中指明来使用此列
我有一个形状如下所示的数据集。
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()
生成的图如下所示。
在这个图中,每个点的颜色都是一样的。但是,我希望它与相关时间的渐变平滑地不同(Year
、Month
、Day
、Hour
、Min
、Sec
) 随着颜色条的增加而增加。该示例如下所示(尽管颜色随深度变化,而不是此示例的时间)。
我一直在做一些测试,我已经让它工作了。
- 使用
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
参数中指明来使用此列