import matplotlib.pyplot as plt
import numpy as np
# Data
activities = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N']
durations = [4, 10, 8, 7, 7, 5, 5, 9, 7, 13, 10, 2, 2, 1]
predecessors = [[], ['A'], ['A'], ['B'], ['B', 'C'], ['C'], ['D'], ['D', 'E'], ['E'], ['E', 'F'], ['G', 'H', 'I'], ['H', 'I'], ['J', 'L'], ['M', 'K']]
# Create horizontal positions for activities
x_pos = np.arange(len(activities))
# Bar chart
plt.figure(figsize=(10, 6)) # Adjust the figure size as needed
# Plot bars
bars = plt.bar(x_pos, durations, color='#007bff') # Customize the color if desired
# Plot predecessor connections
for i, pred in enumerate(predecessors):
for p in pred:
plt.plot([x_pos[activities.index(p)], x_pos[i]], [durations[activities.index(p)], 0], 'k--')
# Axis labels and title
plt.xlabel('Activity')
plt.ylabel('Duration (days)')
plt.title('Project Activities')
# Set x-axis tick labels
plt.xticks(x_pos, activities)
plt.show()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKCiMgRGF0YQphY3Rpdml0aWVzID0gWydBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nXQpkdXJhdGlvbnMgPSBbNCwgMTAsIDgsIDcsIDcsIDUsIDUsIDksIDcsIDEzLCAxMCwgMiwgMiwgMV0KcHJlZGVjZXNzb3JzID0gW1tdLCBbJ0EnXSwgWydBJ10sIFsnQiddLCBbJ0InLCAnQyddLCBbJ0MnXSwgWydEJ10sIFsnRCcsICdFJ10sIFsnRSddLCBbJ0UnLCAnRiddLCBbJ0cnLCAnSCcsICdJJ10sIFsnSCcsICdJJ10sIFsnSicsICdMJ10sIFsnTScsICdLJ11dCgojIENyZWF0ZSBob3Jpem9udGFsIHBvc2l0aW9ucyBmb3IgYWN0aXZpdGllcwp4X3BvcyA9IG5wLmFyYW5nZShsZW4oYWN0aXZpdGllcykpCgojIEJhciBjaGFydApwbHQuZmlndXJlKGZpZ3NpemU9KDEwLCA2KSkgICMgQWRqdXN0IHRoZSBmaWd1cmUgc2l6ZSBhcyBuZWVkZWQKCiMgUGxvdCBiYXJzCmJhcnMgPSBwbHQuYmFyKHhfcG9zLCBkdXJhdGlvbnMsIGNvbG9yPScjMDA3YmZmJykgICMgQ3VzdG9taXplIHRoZSBjb2xvciBpZiBkZXNpcmVkCgojIFBsb3QgcHJlZGVjZXNzb3IgY29ubmVjdGlvbnMKZm9yIGksIHByZWQgaW4gZW51bWVyYXRlKHByZWRlY2Vzc29ycyk6CiAgICBmb3IgcCBpbiBwcmVkOgogICAgICAgIHBsdC5wbG90KFt4X3Bvc1thY3Rpdml0aWVzLmluZGV4KHApXSwgeF9wb3NbaV1dLCBbZHVyYXRpb25zW2FjdGl2aXRpZXMuaW5kZXgocCldLCAwXSwgJ2stLScpCgojIEF4aXMgbGFiZWxzIGFuZCB0aXRsZQpwbHQueGxhYmVsKCdBY3Rpdml0eScpCnBsdC55bGFiZWwoJ0R1cmF0aW9uIChkYXlzKScpCnBsdC50aXRsZSgnUHJvamVjdCBBY3Rpdml0aWVzJykKCiMgU2V0IHgtYXhpcyB0aWNrIGxhYmVscwpwbHQueHRpY2tzKHhfcG9zLCBhY3Rpdml0aWVzKQoKcGx0LnNob3coKQo=