In [1]:
from IPython.html import widgets
from IPython.display import display
from eventful_graph import EventfulGraph
from widget_forcedirectedgraph import ForceDirectedGraphWidget, publish_js
publish_js()
This example requires the Python "twitter" library to be installed (https://github.com/sixohsix/twitter). You can install Python twitter by running sudo pip install twitter
or sudo easy_install twitter
from the commandline.
In [2]:
from twitter import *
import time, datetime
import math
twitter_timestamp_format = "%a %b %d %X +0000 %Y"
In [3]:
# Sign on to twitter.
auth = OAuth(
consumer_key='iQvYfTfuD86fgVWGjPY0UA',
consumer_secret='C3jjP6vzYzTYoHV4s5NYPGuRkpT5SulKRKTkRmYg',
token='2218195843-cOPQa0D1Yk3JbvjvsCa0tIYzBOEWxINekmGcEql',
token_secret='3BFncT1zAvJRN6rj8haCxveZVLZWZ23QeulxzByXWlfoO'
)
twitter = Twitter(auth = auth)
twitter_stream = TwitterStream(auth = auth, block = False)
In [4]:
floating_container = widgets.PopupWidget()
floating_container.description = "Dynamic D3 rendering of a NetworkX graph"
floating_container.button_text = "Render Window"
floating_container.set_css({
'width': '620px',
'height': '450px'}, selector='modal')
graph = EventfulGraph()
d3 = ForceDirectedGraphWidget(graph)
floating_container.children = [d3]
d3.width = 600
d3.height = 400
stop_button = widgets.ButtonWidget(description="Stop")
stop_button.set_css('margin-left', '5px')
# Only listen to tweets while they are available and the user
# doesn't want to stop.
stop_listening = [False]
def handle_stop(sender):
stop_listening[0] = True
print("Service stopped")
stop_button.on_click(handle_stop)
def watch_tweets(screen_name=None):
display(floating_container)
display(stop_button)
graph.node.clear()
graph.adj.clear()
start_timestamp = None
stop_button.add_class('btn-danger')
# Get Barack's tweets
tweets = twitter.statuses.user_timeline(screen_name=screen_name)
user_id = twitter.users.lookup(screen_name=screen_name)[0]['id']
# Determine the maximum number of retweets.
max_retweets = 0.0
for tweet in tweets:
max_retweets = float(max(tweet['retweet_count'], max_retweets))
def plot_tweet(tweet, parent=None, elapsed_seconds=1.0, color="gold"):
new_id = tweet['id']
graph.add_node(
new_id,
r=max(float(tweet['retweet_count']) / max_retweets * 30.0, 3.0),
charge=-60,
fill = color,
)
if parent is not None:
parent_radius = max(float(parent['retweet_count']) / max_retweets * 30.0, 3.0)
graph.node[parent['id']]['r'] = parent_radius
graph.add_edge(new_id, parent['id'], distance=math.log(elapsed_seconds) * 9.0 + parent_radius)
graph.node[new_id]['fill'] = 'red'
# Plot each tweet.
for tweet in tweets:
plot_tweet(tweet)
kernel=get_ipython().kernel
iterator = twitter_stream.statuses.filter(follow=user_id)
while not stop_listening[0]:
kernel.do_one_iteration()
for tweet in iterator:
kernel.do_one_iteration()
if stop_listening[0] or tweet is None:
break
else:
if 'retweeted_status' in tweet:
original_tweet = tweet['retweeted_status']
if original_tweet['id'] in graph.node:
tweet_timestamp = datetime.datetime.strptime(tweet['created_at'], twitter_timestamp_format)
if start_timestamp is None:
start_timestamp = tweet_timestamp
elapsed_seconds = max((tweet_timestamp - start_timestamp).total_seconds(),1.0)
plot_tweet(tweet, parent=original_tweet, elapsed_seconds=elapsed_seconds)
elif 'id' in tweet:
plot_tweet(tweet, color='lime')
In [5]:
watch_tweets(screen_name="justinbieber")