Skip to content

Instantly share code, notes, and snippets.

@lunasorcery
Created December 3, 2020 11:15
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save lunasorcery/3348b3a446a10b0c874670b99c8d53a2 to your computer and use it in GitHub Desktop.
Save lunasorcery/3348b3a446a10b0c874670b99c8d53a2 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import json
from datetime import datetime, timedelta, timezone
import dateutil.parser
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.dates as mdates
renderHorizontal = True
beginningOfTime = datetime.now(timezone.utc)-timedelta(days=5*365) # ignore tweets older than 5 years
with open('data/account.js') as file:
file.seek(27)
account = json.load(file)
with open('data/tweet.js') as file:
file.seek(25)
tweets = json.load(file)
days=[]
times=[]
for tweet in tweets:
date = dateutil.parser.parse(tweet['tweet']['created_at'])
if (date >= beginningOfTime):
timeNoDate = datetime(1970, 1, 1, date.hour, date.minute, date.second)
dateNoTime = datetime(date.year, date.month, date.day)
days.append(dateNoTime)
times.append(timeNoDate)
hoursMajorLocator = mdates.HourLocator(interval=6)
hoursMinorLocator = mdates.HourLocator(interval=1)
hoursMajorFormatter = mdates.DateFormatter('%H:%M')
daysMajorLocator = mdates.YearLocator(base=1)
daysMinorLocator = mdates.MonthLocator()
daysMajorFormatter = mdates.DateFormatter('%Y')
daysMinorFormatter = mdates.DateFormatter('%b')
if renderHorizontal:
fig, ax = plt.subplots(figsize=((max(days)-min(days)).days / 200, 3))
plt.scatter(days, times, s=1, linewidths=0, color='#1f77b4c0')
plt.xlim(min(days), max(days))
plt.ylim(0, 1)
dateAxis = ax.xaxis
hoursAxis = ax.yaxis
daysMinorFormatter = mdates.DateFormatter('')
else:
fig, ax = plt.subplots(figsize=(3, (max(days)-min(days)).days / 200))
plt.scatter(times, days, s=1, linewidths=0, color='#1f77b4c0')
plt.ylim(min(days), max(days))
plt.xlim(0, 1)
dateAxis = ax.yaxis
hoursAxis = ax.xaxis
ax.tick_params(axis='y', which='minor', labelsize=5, color='#777')
# time goes downwards and to the right
plt.gca().invert_yaxis()
hoursAxis.set_major_locator(hoursMajorLocator)
hoursAxis.set_minor_locator(hoursMinorLocator)
hoursAxis.set_major_formatter(hoursMajorFormatter)
dateAxis.set_major_locator(daysMajorLocator)
dateAxis.set_minor_locator(daysMinorLocator)
dateAxis.set_major_formatter(daysMajorFormatter)
dateAxis.set_minor_formatter(daysMinorFormatter)
hoursAxis.set_label('Time of day')
dateAxis.set_label('Date')
plt.title(f"When does @{account[0]['account']['username']} tweet?")
plt.savefig('out.png', bbox_inches='tight', pad_inches=0.3, dpi=300)
plt.savefig('out.svg', bbox_inches='tight', pad_inches=0.3)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment