make sure to include Twitter links in recap
[Ultimately_Untrue_Thought.git] / content / pages / ancillary / categories-scatterplot-source.md
1 Title: Source Code for Scatterplot Figure in "The Categories Were Made for Man to Make Predictions"
2 Status: Hidden
3
4 Requires [NumPy](http://www.numpy.org/), [Matplotlib](https://matplotlib.org/).
5
6 ```python
7 import functools
8 import itertools
9
10 import matplotlib.pyplot as plot
11 from matplotlib.colors import ListedColormap
12 from mpl_toolkits.mplot3d import Axes3D
13 from numpy import array
14 from numpy.random import normal
15
16
17 class Person:
18     def __init__(self, a, b, c):
19         self.a = a
20         self.b = b
21         self.c = c
22
23     def trait_vector(self):
24         return [self.a, self.b, self.c]
25
26     @classmethod
27     def generate_cis_male(cls):
28         a = normal(0, 1)
29         b = normal(0, 1)
30         c = normal(0, 1)
31         return cls(a, b, c)
32
33     @classmethod
34     def generate_cis_female(cls):
35         a = normal(3.5, 1)
36         b = normal(3.5, 1)
37         c = normal(3.5, 1)
38         return cls(a, b, c)
39
40     @classmethod
41     def generate_agp(cls):
42         a = normal(0, 1)
43         b = normal(0, 1)
44         c = normal(3.8, 1)
45         return cls(a, b, c)
46
47 def my_plot():
48     group_size = 50
49
50     p1 = [Person.generate_cis_female().trait_vector()
51           for _ in range(group_size)]
52     p2 = [Person.generate_agp().trait_vector()
53           for _ in range(group_size)]
54     p3 = [Person.generate_cis_male().trait_vector()
55           for _ in range(group_size)]
56
57     p = array(p1 + p2 + p3)
58
59     target = list(functools.reduce(itertools.chain,
60                                    [itertools.repeat(i, group_size)
61                                     for i in range(1, 4)]))
62
63     figure = plot.figure(figsize=(6, 5))
64     axes = Axes3D(figure)
65
66     axes.scatter(p[:, 0], p[:, 1], p[:, 2],
67                  c=target,
68                  cmap=ListedColormap(["#FF1493", "#B000B0", "#1E90FF"]))
69     plot.show()
70
71
72 if __name__ == "__main__":
73     my_plot()
74
75 ```