main.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import sys
  2. import matplotlib.pyplot as plt
  3. import json
  4. import threading
  5. def read_data():
  6. try:
  7. return json.load(open("/tmp/values.pickle", 'r'))
  8. except:
  9. return (0.0, {})
  10. def write_data(values):
  11. json.dump(values, open("/tmp/values.pickle", 'w'))
  12. plt.ion()
  13. plt.figure()
  14. old_time, d = read_data()
  15. plt.pause(0.01)
  16. l = sys.stdin.readline()
  17. time, _ = l.split(" ", 1)
  18. time = float(time)
  19. maps = {}
  20. if time <= old_time:
  21. # Overwrites current values, so flush
  22. d = {}
  23. plt.legend()
  24. else:
  25. for key in d:
  26. maps[key], = plt.plot(d[key][0], d[key][1])
  27. maps[key].set_label(key)
  28. plt.legend()
  29. first = l
  30. while 1:
  31. if first is not None:
  32. l = first
  33. first = None
  34. else:
  35. l = sys.stdin.readline()
  36. if l == "CLOSE":
  37. import sys
  38. sys.exit(0)
  39. elif l == "ALGEBRAIC_LOOP":
  40. continue
  41. time, key, value = l.split(" ")
  42. time = float(time)
  43. try:
  44. value = float(value)
  45. except:
  46. # Value is not a number, so we work with discrete states, just ignore!
  47. pass
  48. value = value.strip()
  49. if key not in maps:
  50. maps[key], = plt.plot([], [])
  51. maps[key].set_label(key)
  52. plt.legend()
  53. if key not in d:
  54. d[key] = ([], [])
  55. d[key][0].append(time)
  56. d[key][1].append(value)
  57. if isinstance(value, str) and value not in d[key][1][:-1]:
  58. for key in d:
  59. prev_color = maps[key].get_color()
  60. maps[key].remove()
  61. maps[key], = plt.plot(d[key][0], d[key][1], c=prev_color)
  62. maps[key].set_label(key)
  63. plt.legend()
  64. maps[key].set_xdata(d[key][0])
  65. maps[key].set_ydata(d[key][1])
  66. plt.gca().set_xlim([min(d[key][0]), max(d[key][0])])
  67. plt.pause(0.01)
  68. write_data((0.0, d))