Last active
September 13, 2017 10:06
-
-
Save doctorlove/ac136157f86ea54bcd4cbd1f7df1ccd0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#From https://gist.github.com/aflaxman/4043086 | |
import csv | |
from pylab import * | |
def cface(ax, x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18): | |
# x1 = height of upper face | |
# x2 = overlap of lower face | |
# x3 = half of vertical size of face | |
# x4 = width of upper face | |
# x5 = width of lower face | |
# x6 = length of nose | |
# x7 = vertical position of mouth | |
# x8 = curvature of mouth | |
# x9 = width of mouth | |
# x10 = vertical position of eyes | |
# x11 = separation of eyes | |
# x12 = slant of eyes | |
# x13 = eccentricity of eyes | |
# x14 = size of eyes | |
# x15 = position of pupils | |
# x16 = vertical position of eyebrows | |
# x17 = slant of eyebrows | |
# x18 = size of eyebrows | |
# transform some values so that input between 0,1 yields variety of output | |
x3 = 1.9*(x3-.5) | |
x4 = (x4+.25) | |
x5 = (x5+.2) | |
x6 = .3*(x6+.01) | |
x8 = 5*(x8+.001) | |
x11 /= 5 | |
x12 = 2*(x12-.5) | |
x13 += .05 | |
x14 += .1 | |
x15 = .5*(x15-.5) | |
x16 = .25*x16 | |
x17 = .5*(x17-.5) | |
x18 = .5*(x18+.1) | |
# top of face, in box with l=-x4, r=x4, t=x1, b=x3 | |
e = mpl.patches.Ellipse( (0,(x1+x3)/2), 2*x4, (x1-x3), fc='white', linewidth=2) | |
ax.add_artist(e) | |
# bottom of face, in box with l=-x5, r=x5, b=-x1, t=x2+x3 | |
e = mpl.patches.Ellipse( (0,(-x1+x2+x3)/2), 2*x5, (x1+x2+x3), fc='white', linewidth=2) | |
ax.add_artist(e) | |
# cover overlaps | |
e = mpl.patches.Ellipse( (0,(x1+x3)/2), 2*x4, (x1-x3), fc='white', ec='none') | |
ax.add_artist(e) | |
e = mpl.patches.Ellipse( (0,(-x1+x2+x3)/2), 2*x5, (x1+x2+x3), fc='white', ec='none') | |
ax.add_artist(e) | |
# draw nose | |
plot([0,0], [-x6/2, x6/2], 'k') | |
# draw mouth | |
p = mpl.patches.Arc( (0,-x7+.5/x8), 1/x8, 1/x8, theta1=270-180/pi*arctan(x8*x9), theta2=270+180/pi*arctan(x8*x9)) | |
ax.add_artist(p) | |
# draw eyes | |
p = mpl.patches.Ellipse( (-x11-x14/2,x10), x14, x13*x14, angle=-180/pi*x12, facecolor='white') | |
ax.add_artist(p) | |
p = mpl.patches.Ellipse( (x11+x14/2,x10), x14, x13*x14, angle=180/pi*x12, facecolor='white') | |
ax.add_artist(p) | |
# draw pupils | |
p = mpl.patches.Ellipse( (-x11-x14/2-x15*x14/2, x10), .05, .05, facecolor='black') | |
ax.add_artist(p) | |
p = mpl.patches.Ellipse( (x11+x14/2-x15*x14/2, x10), .05, .05, facecolor='black') | |
ax.add_artist(p) | |
# draw eyebrows | |
plot([-x11-x14/2-x14*x18/2,-x11-x14/2+x14*x18/2],[x10+x13*x14*(x16+x17),x10+x13*x14*(x16-x17)],'k') | |
plot([x11+x14/2+x14*x18/2,x11+x14/2-x14*x18/2],[x10+x13*x14*(x16+x17),x10+x13*x14*(x16-x17)],'k') | |
if __name__ == '__main__': | |
with open('iris.data', 'r') as csvfile: | |
reader = csv.reader(csvfile) | |
fig = figure(figsize=(11,11)) | |
i = 0 | |
for row in reader: | |
ax = fig.add_subplot(15,10,i+1,aspect='equal') | |
data = row[0:3] | |
data.extend([0.5]*14)#whatever | |
data[0]= float(data[0]) | |
data[1]= float(data[1]) | |
data[2]= float(data[2]) | |
data[3]= float(data[3]) | |
cface(ax, .9, *data) | |
ax.axis([-1.2,1.2,-1.2,1.2]) | |
ax.set_xticks([]) | |
ax.set_yticks([]) | |
i += 1 | |
fig.subplots_adjust(hspace=0.05, wspace=0.05) | |
show() | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#From https://gist.github.com/aflaxman/4043086 | |
import csv | |
from pylab import * | |
def cface(ax, x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18): | |
# x1 = height of upper face | |
# x2 = overlap of lower face | |
# x3 = half of vertical size of face | |
# x4 = width of upper face | |
# x5 = width of lower face | |
# x6 = length of nose | |
# x7 = vertical position of mouth | |
# x8 = curvature of mouth | |
# x9 = width of mouth | |
# x10 = vertical position of eyes | |
# x11 = separation of eyes | |
# x12 = slant of eyes | |
# x13 = eccentricity of eyes | |
# x14 = size of eyes | |
# x15 = position of pupils | |
# x16 = vertical position of eyebrows | |
# x17 = slant of eyebrows | |
# x18 = size of eyebrows | |
# transform some values so that input between 0,1 yields variety of output | |
x3 = 1.9*(x3-.5) | |
x4 = (x4+.25) | |
x5 = (x5+.2) | |
x6 = .3*(x6+.01) | |
x8 = 5*(x8+.001) | |
x11 /= 5 | |
x12 = 2*(x12-.5) | |
x13 += .05 | |
x14 += .1 | |
x15 = .5*(x15-.5) | |
x16 = .25*x16 | |
x17 = .5*(x17-.5) | |
x18 = .5*(x18+.1) | |
# top of face, in box with l=-x4, r=x4, t=x1, b=x3 | |
e = mpl.patches.Ellipse( (0,(x1+x3)/2), 2*x4, (x1-x3), fc='white', linewidth=2) | |
ax.add_artist(e) | |
# bottom of face, in box with l=-x5, r=x5, b=-x1, t=x2+x3 | |
e = mpl.patches.Ellipse( (0,(-x1+x2+x3)/2), 2*x5, (x1+x2+x3), fc='white', linewidth=2) | |
ax.add_artist(e) | |
# cover overlaps | |
e = mpl.patches.Ellipse( (0,(x1+x3)/2), 2*x4, (x1-x3), fc='white', ec='none') | |
ax.add_artist(e) | |
e = mpl.patches.Ellipse( (0,(-x1+x2+x3)/2), 2*x5, (x1+x2+x3), fc='white', ec='none') | |
ax.add_artist(e) | |
# draw nose | |
plot([0,0], [-x6/2, x6/2], 'k') | |
# draw mouth | |
p = mpl.patches.Arc( (0,-x7+.5/x8), 1/x8, 1/x8, theta1=270-180/pi*arctan(x8*x9), theta2=270+180/pi*arctan(x8*x9)) | |
ax.add_artist(p) | |
#print "(0,",-x7+.5/x8, "),", 1/x8, ", ", 1/x8, ", ", 270-180/pi*arctan(x8*x9), ", ", 270+180/pi*arctan(x8*x9) | |
# draw eyes | |
p = mpl.patches.Ellipse( (-x11-x14/2,x10), x14, x13*x14, angle=-180/pi*x12, facecolor='white') | |
ax.add_artist(p) | |
p = mpl.patches.Ellipse( (x11+x14/2,x10), x14, x13*x14, angle=180/pi*x12, facecolor='white') | |
ax.add_artist(p) | |
# draw pupils | |
p = mpl.patches.Ellipse( (-x11-x14/2-x15*x14/2, x10), .05, .05, facecolor='black') | |
ax.add_artist(p) | |
p = mpl.patches.Ellipse( (x11+x14/2-x15*x14/2, x10), .05, .05, facecolor='black') | |
ax.add_artist(p) | |
# draw eyebrows | |
plot([-x11-x14/2-x14*x18/2,-x11-x14/2+x14*x18/2],[x10+x13*x14*(x16+x17),x10+x13*x14*(x16-x17)],'k') | |
plot([x11+x14/2+x14*x18/2,x11+x14/2-x14*x18/2],[x10+x13*x14*(x16+x17),x10+x13*x14*(x16-x17)],'k') | |
def with_data(): | |
with open('iris.data', 'r') as csvfile: | |
reader = csv.reader(csvfile) | |
fig = figure(figsize=(11,11)) | |
i = 0 | |
for row in reader: | |
ax = fig.add_subplot(15,10,i+1,aspect='equal') | |
data = [0.5]*17#whatever | |
data[0] = float(row[1]) | |
data[1] = float(row[0]) | |
data[2] = float(row[2]) | |
data[12] = float(row[3]) | |
cface(ax, .9, *data) | |
ax.axis([-1.2,1.2,-1.2,1.2]) | |
ax.set_xticks([]) | |
ax.set_yticks([]) | |
i += 1 | |
fig.subplots_adjust(hspace=0.05,wspace=0.0) | |
show() | |
def without_data(): | |
fig = figure(figsize=(11,11)) | |
i = 0 | |
ax = fig.add_subplot(15,10,i+1,aspect='equal') | |
data = [0.5]*17#whatever | |
data[1] = 2.0 | |
data[4] = 3.0 | |
data[7] = 4.0 | |
data[14] = 5.0 | |
cface(ax, .9, *data) | |
ax.axis([-1.2,1.2,-1.2,1.2]) | |
ax.set_xticks([]) | |
ax.set_yticks([]) | |
fig.subplots_adjust(hspace=0.05, wspace=0.05) | |
show() | |
if __name__ == '__main__': | |
with_data() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For use at the Sept 2017 ACCU london short talks.
Based on https://healthyalgorithms.com/2012/11/12/dataviz-in-python-chernoff-faces-with-matplotlib/ using the iris data:
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/