-
Notifications
You must be signed in to change notification settings - Fork 0
/
plot4.py
85 lines (61 loc) · 3.07 KB
/
plot4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import matplotlib.pyplot as plt
import pandas as pd
from plot_common import *
### Results generated by ###
# python3.11 sim.py zipf1_80/zipf1_80_hint.txt fig2 zipf1_80/zipf1_80_hint.txt 2
# copies_taken100_rand should be same as fig1
# https://saturncloud.io/blog/breaking-the-xaxis-in-matplotlib-a-guide/
# https://matplotlib.org/stable/gallery/subplots_axes_and_figures/broken_axis.html
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, gridspec_kw={'height_ratios': [1, 4]})
# ax.axhline(y=30, ls='--', label="Initial # of copies")
N_BLOCK_PER_POOL = 1000
ax1.axvline(x=N_BLOCK_PER_POOL, ls='--', linewidth=0.5, color=new_black)
ax2.axvline(x=N_BLOCK_PER_POOL, ls='--', linewidth=0.5, color=new_black)
df = pd.read_csv("fig4_block_reads.csv")
df.columns=["Block ID", "Random", "Distrubute Hot", "Hot Together", r"Hot Together ($8\times)\dag$"]
# plot the same data on both axes
df.plot(ax=ax1, x=0, style=[None, None, None, '--'], legend=False)
df.plot(ax=ax2, x=0, style=[None, None, None, '--'], legend=False)
ax2.set(xlabel='Block ID (sorted from most to least accessed)', ylabel='Total Reads')
### broken axis ###
# zoom-in / limit the view to different portions of the data
ax1.set_ylim(12000 - 150, 12000 + 50) # outliers
ax2.set_ylim(0, 2350) # most of the data
# hide the spines between ax and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False) # don't put tick labels at the top
ax2.xaxis.tick_bottom()
# Now, let's turn towards the cut-out slanted lines.
# We create line objects in axes coordinates, in which (0,0), (0,1),
# (1,0), and (1,1) are the four corners of the axes.
# The slanted lines themselves are markers at those locations, such that the
# lines keep their angle and position, independent of the axes size or scale
# Finally, we need to disable clipping.
_y = .5 # proportion of vertical to horizontal extent of the slanted line
_x = 1
kwargs = dict(marker=[(-_x, -_y), (_x, _y)], markersize=6,
linestyle="none", markeredgecolor=new_black, markeredgewidth=0.5, clip_on=False)
cut_upper, = ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) # Every column of x and y lists is new point. 0,0 is left bottom, 1,0 is right bottom
cut_lower, = ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs) # 0,1 is left top, 1,1 is right top
cut_upper.set_zorder(1000)
###################
# fig.legend(handles=[line1, line2, line3, line4])
print()
fig.legend(handles=ax2.get_lines())
plt.tight_layout(pad=0.25)
fig.subplots_adjust(hspace=0.035)
fig.figure.savefig("fig4a.pdf")
###############################################################################
fig, ax = plt.subplots()
df = pd.read_csv("fig4_rebuild_requests.csv")
df.columns=["Year", "Random", "Distrubute Hot", "Hot Together", r"Hot Together ($8\times)\dag$"]
df.plot(ax=ax, x=0, logy=True, style=[None, None, None, '--'])
# ax.set_box_aspect(1) # makes plot square
ax.set(xlabel='Year', ylabel='Rebuilt Blocks')
ax.legend()
ax.set_yscale('symlog')
# ax.set_ylim(-1)
plt.tight_layout(pad=0.25)
fig.figure.savefig("fig4b.pdf")