#dataframe #matplotlib #pyspark #scatter-plot
Вопрос:
У меня есть точечная диаграмма, использующая приведенный ниже код
c1 = data_pd[data_pd.cluster == 0]
c2 = data_pd[data_pd.cluster == 1]
c3 = data_pd[data_pd.cluster == 2]
c4 = data_pd[data_pd.cluster == 3]
c5 = data_pd[data_pd.cluster == 4]
plt.scatter(c1.date, c1['totValue'],color='green')
plt.scatter(c2.date, c2['totValue'],color='blue')
plt.scatter(c3.date, c3['totValue'],color='red')
plt.scatter(c4.date, c4['totValue'],color='pink')
plt.scatter(c5.date, c5['totValue'],color='yellow')
plt.xlabel('date')
plt.ylabel('totValue')
столбец даты имеет числовой формат. поэтому, как только будет сгенерирована точечная диаграмма, значения по оси x будут в формате 1e18. Но я хочу отобразить дату как 2021-01-01 и т. Д. Как я могу отображать значения по оси x таким образом?
Ответ №1:
У вас есть столбец даты в формате метки времени, я подозреваю, в миллисекундах, вот так: 1635759825292
.
Что вам нужно сделать, так это преобразовать метку времени в datetime
объект, а затем определить, как matplotlib обрабатывает формат datetime
использования matplotlib.dates
и DateFormatter
.
Вот пример:
import random
from pyspark.sql import SparkSession
import matplotlib.pyplot as plt
import matplotlib.dates as md
from datetime import datetime
def plot_cluster(cluster, color, data_pd):
data = data_pd[data_pd.cluster == cluster]
dates = [datetime.fromtimestamp(x / 1000) for x in data.date]
plt.scatter(dates, data["count"], color=color)
if __name__ == "__main__":
spark = SparkSession.builder.getOrCreate()
data = [
{
"date": 1635759507038 random.randrange(5000),
"count": random.randrange(20, 100),
"cluster": random.randrange(5),
}
for _ in range(100)
]
df = spark.createDataFrame(data)
data_pd = df.toPandas()
ax = plt.gca()
plt.xticks(rotation=25)
xfmt = md.DateFormatter("%Y-%m-%d %H:%M:%S")
ax.xaxis.set_major_formatter(xfmt)
clusters = [0, 1, 2, 3, 4]
colors = ["green", "blue", "red", "pink", "yellow"]
for cluster, color in zip(clusters, colors):
plot_cluster(cluster, color, data_pd)
plt.xlabel("date")
plt.ylabel("count")
plt.tight_layout()
plt.show()
Обратите внимание: x / 1000
Фигура: