import matplotlib.pyplot as plt
import numpy as np
from io import StringIO

# Four of the thirteen "Datasaurus Dozen" datasets (Matejka & Fitzmaurice, 2017;
# the dinosaur is Alberto Cairo's). Each has 142 points; the numbers below are the
# published coordinates. Every panel prints its own statistics, computed here.
DINO_X = [
    55.3846, 51.5385, 46.1538, 42.8205, 40.7692, 38.7179, 35.641, 33.0769, 28.9744, 26.1538,
    23.0769, 22.3077, 22.3077, 23.3333, 25.8974, 29.4872, 32.8205, 35.3846, 40.2564, 44.1026,
    46.6667, 50, 53.0769, 56.6667, 59.2308, 61.2821, 61.5385, 61.7949, 57.4359, 54.8718, 52.5641,
    48.2051, 49.4872, 51.0256, 45.3846, 42.8205, 38.7179, 35.1282, 32.5641, 30, 33.5897, 36.6667,
    38.2051, 29.7436, 29.7436, 30, 32.0513, 35.8974, 41.0256, 44.1026, 47.1795, 49.4872, 51.5385,
    53.5897, 55.1282, 56.6667, 59.2308, 62.3077, 64.8718, 67.9487, 70.5128, 71.5385, 71.5385,
    69.4872, 46.9231, 48.2051, 50, 53.0769, 55.3846, 56.6667, 56.1538, 53.8462, 51.2821, 50,
    47.9487, 29.7436, 29.7436, 31.2821, 57.9487, 61.7949, 64.8718, 68.4615, 70.7692, 72.0513,
    73.8462, 75.1282, 76.6667, 77.6923, 79.7436, 81.7949, 83.3333, 85.1282, 86.4103, 87.9487,
    89.4872, 93.3333, 95.3846, 98.2051, 56.6667, 59.2308, 60.7692, 63.0769, 64.1026, 64.359, 74.359,
    71.2821, 67.9487, 65.8974, 63.0769, 61.2821, 58.7179, 55.1282, 52.3077, 49.7436, 47.4359,
    44.8718, 48.7179, 51.2821, 54.1026, 56.1538, 52.0513, 48.7179, 47.1795, 46.1538, 50.5128,
    53.8462, 57.4359, 60, 64.1026, 66.9231, 71.2821, 74.359, 78.2051, 67.9487, 68.4615, 68.2051,
    37.6923, 39.4872, 91.2821, 50, 47.9487, 44.1026]
DINO_Y = [
    97.1795, 96.0256, 94.4872, 91.4103, 88.3333, 84.8718, 79.8718, 77.5641, 74.4872, 71.4103,
    66.4103, 61.7949, 57.1795, 52.9487, 51.0256, 51.0256, 51.0256, 51.4103, 51.4103, 52.9487,
    54.1026, 55.2564, 55.641, 56.0256, 57.9487, 62.1795, 66.4103, 69.1026, 55.2564, 49.8718,
    46.0256, 38.3333, 42.1795, 44.1026, 36.4103, 32.5641, 31.4103, 30.2564, 32.1795, 36.7949,
    41.4103, 45.641, 49.1026, 36.0256, 32.1795, 29.1026, 26.7949, 25.2564, 25.2564, 25.641, 28.718,
    31.4103, 34.8718, 37.5641, 40.641, 42.1795, 44.4872, 46.0256, 46.7949, 47.9487, 53.718, 60.641,
    64.4872, 69.4872, 79.8718, 84.1026, 85.2564, 85.2564, 86.0256, 86.0256, 82.9487, 80.641, 78.718,
    78.718, 77.5641, 59.8718, 62.1795, 62.5641, 99.4872, 99.1026, 97.5641, 94.1026, 91.0256,
    86.4103, 83.3333, 79.1026, 75.2564, 71.4103, 66.7949, 60.2564, 55.2564, 51.4103, 47.5641,
    46.0256, 42.5641, 39.8718, 36.7949, 33.718, 40.641, 38.3333, 33.718, 29.1026, 25.2564, 24.1026,
    22.9487, 22.9487, 22.1795, 20.2564, 19.1026, 19.1026, 18.3333, 18.3333, 18.3333, 17.5641,
    16.0256, 13.718, 14.8718, 14.8718, 14.8718, 14.1026, 12.5641, 11.0256, 9.8718, 6.0256, 9.4872,
    10.2564, 10.2564, 10.641, 10.641, 10.641, 10.641, 10.641, 10.641, 8.718, 5.2564, 2.9487,
    25.7692, 25.3846, 41.5385, 95.7692, 95, 92.6923]
STAR_X = [
    58.2136, 58.1961, 58.7182, 57.2784, 58.082, 57.4894, 28.0887, 28.0855, 28.0873, 27.578, 27.7799,
    28.589, 28.7391, 27.0246, 28.8013, 27.1865, 29.2851, 39.4029, 28.8113, 34.304, 29.6028, 49.1162,
    39.6175, 43.2331, 64.8928, 62.4901, 68.9881, 62.1056, 32.4618, 41.3272, 44.0071, 44.0741,
    44.0013, 45.0063, 44.4438, 42.1787, 44.0446, 41.6405, 41.9383, 44.0539, 39.2067, 28.7044,
    31.7087, 42.8117, 43.3006, 40.3986, 40.4357, 40.9365, 39.6616, 40.8993, 41.9686, 40.3834,
    56.5381, 52.9707, 54.621, 65.099, 63.056, 70.9601, 69.8958, 70.5959, 69.647, 77.393, 64.4008,
    63.869, 56.5944, 56.5313, 59.6522, 56.6365, 58.6723, 58.2216, 57.9147, 55.3155, 54.5757,
    54.4131, 55.0745, 29.433, 29.4227, 29.0056, 58.4618, 57.9978, 57.5495, 59.5299, 58.2494,
    58.0245, 58.3821, 62.5668, 72.1758, 79.4728, 80.3577, 78.7572, 82.5402, 86.4359, 79.4887,
    81.5304, 79.1868, 77.8991, 75.1307, 76.058, 57.6147, 56.1714, 66.2879, 67.8817, 64.0281,
    77.4967, 77.6347, 77.8637, 77.3382, 76.1804, 77.2527, 77.4134, 76.7318, 49.4711, 42.4765,
    43.5951, 50.34, 40.749, 38.3865, 38.404, 38.7643, 41.4701, 47.1554, 39.5826, 41.7402, 39.3119,
    41.6798, 39.0875, 41.4815, 77.6061, 75.9827, 76.9458, 77.5437, 77.5847, 76.8223, 77.3486,
    77.5732, 77.9726, 41.5289, 43.7226, 79.3261, 56.664, 57.8218, 58.2432]
STAR_Y = [
    91.8819, 92.215, 90.3105, 89.9076, 92.0081, 88.0853, 63.5108, 63.5902, 63.1233, 62.821, 63.5181,
    63.0241, 62.7209, 62.9019, 63.389, 63.5587, 63.3836, 51.1509, 61.3579, 56.5421, 60.1573, 63.66,
    62.9252, 63.1652, 65.8142, 74.5843, 63.2321, 75.9909, 62.8819, 49.0703, 46.4497, 34.5532,
    33.9042, 38.299, 36.0191, 26.4921, 35.6622, 27.0931, 24.9915, 33.5564, 51.5337, 61.7775,
    58.8378, 30.0204, 31.5264, 16.347, 20.2327, 16.913, 15.6094, 20.7985, 26.4971, 21.3912, 32.4442,
    29.0402, 30.3445, 27.2416, 29.7091, 41.2595, 43.4538, 41.9647, 44.0444, 63.3715, 67.4487,
    70.2137, 86.927, 87.4998, 87.8095, 85.6375, 90.0772, 90.411, 89.9538, 80.2519, 77.5363, 78.2291,
    79.8175, 60.8018, 63.0685, 63.3908, 90.2653, 92.1599, 90.7489, 88.3273, 92.1297, 91.6944,
    90.5535, 77.7439, 63.1289, 63.4087, 63.2954, 53.3326, 56.5411, 59.7928, 53.6517, 56.0254,
    53.2348, 51.8225, 23.3724, 16.3837, 33.8224, 32.118, 26.1171, 24.236, 27.6727, 14.9485, 14.4619,
    14.6107, 15.8901, 15.9126, 15.1515, 15.2219, 16.2168, 25.063, 18.3385, 19.9942, 26.4714,
    16.1821, 14.5802, 14.4519, 14.3656, 17.278, 22.3779, 17.6485, 17.8293, 15.6407, 17.7459,
    15.1223, 18.0474, 15.1629, 16.3069, 15.8585, 15.2539, 15.83, 15.5952, 15.7745, 14.7806, 14.9557,
    24.9164, 19.0773, 52.9004, 87.9401, 90.6932, 92.1043]
BULLSEYE_X = [
    51.2039, 58.9745, 51.8721, 48.1799, 41.6832, 37.8904, 39.549, 39.6496, 34.7506, 27.5608,
    24.6355, 20.9595, 20.6891, 19.2882, 20.0245, 35.4695, 36.8943, 39.0555, 46.9571, 37.3105,
    40.0097, 48.0144, 53.7038, 63.0675, 62.048, 59.84, 55.1609, 61.2798, 60.8349, 61.5206, 36.9165,
    38.5022, 48.6644, 50.2853, 42.2763, 54.0318, 37.3294, 41.3895, 40.0747, 35.3497, 34.7637,
    37.0266, 36.4556, 35.5377, 20.4089, 23.4957, 29.5575, 33.0082, 53.9804, 52.2343, 59.5031,
    41.1638, 48.993, 59.2693, 45.4692, 62.6913, 73.4287, 70.8464, 71.539, 67.6209, 72.471, 64.8122,
    60.8537, 67.7895, 41.6096, 53.003, 54.7142, 44.2917, 49.1917, 53.1014, 51.5998, 54.3797,
    46.4808, 53.1747, 45.272, 36.0334, 28.2712, 25.0548, 64.7589, 63.1445, 50.4247, 70.645, 63.149,
    62.824, 70.2369, 70.0427, 72.5706, 75.1307, 83.2939, 79.6643, 88.4321, 89.1156, 89.0922, 91.726,
    91.7355, 91.5079, 88.239, 88.5305, 55.3652, 62.5603, 58.0067, 55.0671, 61.6148, 68.5431,
    77.7061, 68.453, 68.2572, 70.2555, 65.0443, 60.0922, 52.992, 50.1446, 46.5086, 43.807, 57.8179,
    50.9405, 63.4973, 50.0165, 58.6368, 54.7303, 65.8755, 57.061, 46.8199, 38.3594, 47.3154,
    55.0519, 50.516, 49.6774, 67.2807, 66.173, 61.0885, 66.0531, 72.67, 61.5035, 68.995, 78.2499,
    36.482, 50.9677, 91.1911, 55.8638, 49.2806, 43.3685]
BULLSEYE_Y = [
    83.3398, 85.4998, 85.8297, 85.0451, 84.0179, 82.5675, 80.8126, 82.6645, 80.0111, 72.8478,
    71.6107, 66.0415, 62.7213, 62.0631, 61.3426, 43.1159, 47.7066, 55.547, 65.2404, 45.2588,
    60.9866, 65.7128, 66.3895, 64.035, 63.8459, 64.4768, 65.2373, 65.7664, 64.6038, 64.7919,
    41.0952, 41.5672, 30.6807, 30.3379, 34.5276, 29.6723, 39.602, 37.2961, 34.6237, 47.1411,
    47.6248, 44.4623, 40.7918, 48.7294, 32.203, 25.3225, 21.3648, 15.9851, 29.351, 29.7117, 30.6697,
    34.3158, 32.0304, 29.6407, 33.8312, 30.2904, 48.5779, 52.2823, 45.5218, 38.0066, 51.1221,
    62.8109, 65.4991, 61.3637, 83.8487, 84.6748, 84.0431, 82.9094, 85.8762, 84.5477, 84.8198,
    84.2404, 83.5182, 84.2606, 85.2371, 53.3717, 72.8402, 71.5486, 82.3152, 85.2367, 85.1747,
    82.4309, 83.9469, 84.9662, 82.1712, 80.385, 80.9712, 79.9841, 70.7784, 73.9323, 64.6242,
    64.0015, 57.7682, 52.6234, 48.9702, 53.3127, 31.4774, 30.476, 30.4459, 30.4471, 30.2537,
    29.0115, 29.9944, 35.6578, 20.3043, 13.0355, 12.3846, 13.2504, 11.0008, 11.8721, 9.9067,
    12.2115, 11.2071, 11.3189, 10.9451, 9.6915, 11.9141, 11.9339, 11.9747, 11.4129, 11.7324, 9.9206,
    10.4947, 13.4313, 12.8535, 11.95, 9.7656, 10.3831, 14.1287, 12.0379, 10.0845, 13.3802, 15.2342,
    10.8284, 13.9943, 17.8832, 15.1628, 29.6798, 46.6743, 85.3365, 84.0488, 84.3322]
X_SHAPE_X = [
    38.3378, 35.7519, 32.7672, 33.7296, 37.2382, 36.0272, 39.2393, 39.7845, 35.166, 40.6221,
    39.1819, 42.4309, 43.0813, 44.3607, 44.3248, 47.5522, 48.6649, 46.2806, 50.5632, 52.631,
    54.6362, 51.346, 57.1349, 54.1712, 50.9424, 66.5129, 64.3979, 68.6866, 65.0278, 53.3045,
    52.9452, 45.2257, 50.8433, 49.6593, 47.1428, 41.2701, 47.1301, 40.916, 38.6602, 42.6126, 41.209,
    50.6492, 52.1319, 39.7973, 43.5499, 36.7147, 37.2246, 40.5124, 40.2221, 44.125, 42.3463,
    44.1891, 45.8142, 46.6431, 52.1899, 51.1003, 65.4008, 64.852, 63.4038, 65.3715, 61.908, 71.8267,
    72.6546, 76.8886, 43.7446, 39.0542, 39.9317, 39.7628, 41.3234, 41.7873, 39.7556, 40.7499,
    43.8569, 42.3678, 39.463, 44.5173, 41.6361, 45.4229, 42.0029, 76.1056, 79.2026, 84.8482,
    81.5645, 85.4462, 80.3125, 80.7662, 82.6701, 77.1636, 74.0707, 74.1142, 68.9421, 73.242, 71.867,
    71.5692, 71.4829, 78.1285, 78.7898, 77.7815, 48.5306, 65.5308, 70.118, 70.4723, 76.7911,
    72.4094, 76.2713, 76.9533, 75.1077, 75.9693, 75.2839, 77.0522, 42.8268, 42.0807, 39.8783,
    36.4755, 37.1031, 34.149, 37.5794, 41.0643, 42.1953, 36.6056, 39.4312, 37.5621, 34.2381,
    34.1409, 36.6593, 40.6437, 36.7925, 75.9483, 76.8407, 81.9505, 81.6437, 84.6102, 84.1029, 80.18,
    80.5733, 79.0043, 40.0482, 34.7946, 79.2218, 36.0309, 34.4996, 31.1069]
X_SHAPE_Y = [
    92.4727, 94.1168, 88.5183, 88.6223, 83.7249, 82.0408, 79.2637, 82.2606, 84.1565, 78.5421,
    79.819, 75.1336, 75.3467, 70.4742, 71.0459, 66.4604, 64.961, 68.0284, 62.6238, 59.9639, 57.4938,
    61.6006, 53.878, 58.0598, 62.0974, 59.0713, 56.1749, 62.2373, 57.0963, 40.8838, 40.3846,
    30.5552, 37.7446, 36.2734, 32.0251, 21.7218, 31.3099, 23.5416, 21.6895, 24.1951, 24.1287,
    37.4838, 39.3646, 16.0835, 24.3072, 17.3818, 17.9801, 22.9622, 20.6146, 23.3662, 24.5583,
    28.7726, 31.057, 31.4072, 39.3678, 38.0957, 42.614, 43.1337, 44.8475, 42.696, 53.1904, 65.6862,
    66.8783, 72.1655, 71.268, 83.119, 79.9392, 76.406, 80.2119, 83.9881, 79.6571, 77.2047, 77.6098,
    73.6383, 78.46, 70.3693, 76.2492, 69.0955, 97.8376, 95.305, 92.4072, 95.4248, 83.7929, 83.0783,
    76.5162, 79.8961, 81.7115, 73.5237, 68.4796, 71.9264, 62.6352, 67.3533, 34.3292, 34.6992,
    34.6805, 23.1392, 25.5972, 23.4472, 34.1525, 42.2811, 36.4482, 36.0881, 28.072, 33.0393,
    25.5695, 27.7706, 30.017, 29.0389, 24.8748, 27.9056, 25.557, 24.9465, 18.3249, 17.7189, 15.4456,
    13.5239, 15.0159, 12.2145, 20.9194, 15.7489, 19.3238, 11.9284, 13.7132, 4.5777, 17.682, 20.2409,
    13.3921, 22.7448, 20.9185, 19.8746, 16.5918, 14.2478, 8.9807, 19.0888, 8.3656, 10.6282, 24.2615,
    13.9697, 22.0946, 93.1217, 86.61, 89.4616]

datasets = [('dino', DINO_X, DINO_Y), ('star', STAR_X, STAR_Y),
            ('bullseye', BULLSEYE_X, BULLSEYE_Y), ('x_shape', X_SHAPE_X, X_SHAPE_Y)]

ORANGE = '#f0883e'
plt.rcParams.update({'text.color': 'gray', 'axes.labelcolor': 'gray', 'axes.edgecolor': 'gray',
                     'xtick.color': 'gray', 'ytick.color': 'gray'})
fig, axes = plt.subplots(1, 4, figsize=(10, 3.4), sharex=True, sharey=True)
for ax, (name, x, y) in zip(axes, datasets):
    x, y = np.array(x), np.array(y)
    ax.plot(x, y, 'o', color=ORANGE, markersize=3)
    ax.set_title(f'{name}  (n = {len(x)})', fontsize=9)
    ax.set_xlabel(f'mean x {x.mean():.1f}   sd x {x.std(ddof=1):.1f}\n'
                  f'mean y {y.mean():.1f}   sd y {y.std(ddof=1):.1f}\n'
                  f'r {np.corrcoef(x, y)[0, 1]:.2f}', fontsize=7.5, family='monospace')
    ax.set_xlim(10, 105)
    ax.set_ylim(-5, 105)
    ax.tick_params(labelsize=7.5)
fig.suptitle('The Datasaurus: the same means, standard deviations and correlation; four different pictures', fontsize=10)

plt.tight_layout()

buffer = StringIO()
plt.savefig(buffer, format="svg", transparent=True)
print(buffer.getvalue())

plt.close()
