Как создать Boxplot с отметкой времени с помощью Matplotlib и Seaborn? - PullRequest
0 голосов
/ 26 мая 2020

Я пытался получить диаграмму, где каждая ячейка представляет эмоцию в течение определенного периода времени.

Picture shown below

Фрейм данных, используемый для построения графика, содержит метку времени и имя эмоции. Я попытался сначала преобразовать метку времени в строку, затем в datetime и, наконец, в int64. Это привело к промежуткам между метками x, как видно на графике. Я пробовал то же самое без преобразования в int64, но matplotlib, похоже, не разрешает даты в графике.

Я прилагаю здесь код, который я использовал:

import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib qt
import pandas as pd
import numpy as np
from datetime import datetime
import seaborn as sns

data = pd.read_csv("TX-governor-sentiment.csv")

## check data types
data.dtypes

# drop rows with all missing values
data = data.dropna(how='all')

## transforming the timestamp column
#convert from obj type to string then to date type
data['timestamp2'] = data['timestamp']
data['timestamp2'] = pd.to_datetime(data['timestamp2'].astype(str), format='%m/%d/%Y %H:%M')

# convert to number format with the following logic:
# yyyymmddhourmin --> this allows us to treat dates as a continuous variable
data['timestamp2'] = data['timestamp2'].dt.strftime('%Y%m%d%H%M')
data['timestamp2'] = data['timestamp2'].astype('int64')

print (data[['timestamp','timestamp2']])

#data transformation for data from Orange
df = pd.DataFrame(columns=('timestamp', 'emotion'))
for index, row in data.iterrows():
    if row['sentiment'] == 0:
        df.loc[index] = [row['timestamp2'], 'Neutral']
    else:
        df.loc[index] = [row['timestamp2'], row['Emotion']]


# Plot using Seaborn & Matplotlib
#convert timestamp in case it's not in number format
df['timestamp'] = df['timestamp'].astype('int64') 

fig = plt.figure(figsize=(10,10))
#colors = {"Neutral": "grey", "Joy": "pink", "Surprise":"blue"}

#visualize as boxplot
plot_ = sns.boxplot(x="timestamp", y="emotion", data=df, width=0.5,whis=np.inf);
#add data point on top
plot_ = sns.stripplot(x="timestamp", y="emotion", data=df, alpha=0.8, color="black");

fig.canvas.draw()

#modify ticks and labels
plt.xlim([202003010000,202004120000])
plt.xticks([202003010000, 202003150000, 202003290000, 202004120000], ['2020/03/01', '2020/03/15', '2020/03/29', '2020/04/12'])

#add colors
for patch in plot_.artists:
    r, g, b, a = patch.get_facecolor()
    patch.set_facecolor((r, g, b, .3))

Пожалуйста, дайте мне знать, как я могу решить эту проблему пробелов в диаграмме коробки. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...