首页 > 解决方案 > 散点图的不同颜色渐变取决于时间(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

目录数据框

我使用 DataFrame 绘制了每个事件的地图,Axes3D坐标以列Lat、、LonDepthcatalog形式给出。

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

结果图如下所示。 3D 震源图

在这个图中,每个点的颜色都是相同的。但是,我希望它与渐变平滑不同,因为相关时间(Year, Month, Day, Hour, Min, Sec)随着颜色条的增加而增加。该示例如下所示(尽管颜色会随着深度而变化,而不是此示例的时间)。

基准示例

标签: datetimematplotlibdata-visualizationscatter-plotcolorbar

解决方案


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

  1. 在您的数据框上创建一个新列,其中包含格式catalog的时间信息。datetime为此,请使用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。您可以使用此新列将其直接绘制为颜色,方法是在函数的c参数中指示它ax.scatter,但它可能不会形成非常漂亮的颜色条。

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。c通过在您的参数中指明来使用此列ax.scatter


推荐阅读