From 31acf869b4cd53f2230a6d979a3583dc8c0ddba0 Mon Sep 17 00:00:00 2001 From: AD Date: Thu, 21 Dec 2017 15:29:12 +0100 Subject: [PATCH] Implemented multi-view matplotlib cluster interface; Fixed some bugs --- __pycache__/def_functions.cpython-36.pyc | Bin 1269 -> 1801 bytes def_functions.py | 17 + generateTagClusters.py | 377 ++++++++------ matplotlibrc | 620 +++++++++++++++++++++++ 4 files changed, 873 insertions(+), 141 deletions(-) create mode 100644 matplotlibrc diff --git a/__pycache__/def_functions.cpython-36.pyc b/__pycache__/def_functions.cpython-36.pyc index 01d59e596e6aac4ba429daea4698f9733794b878..7e42d5274348df1f8872c39538a35e3139a912de 100644 GIT binary patch delta 661 zcmYk3y>1jS5XU{X_wz`Uh?5eM6ut(r5(SWw1}PO3H0cbDS)1I7{kYhMh{($omxek| zfkeYY@DkgmArC;$>_!4cn%{ps#%CyO3*5on=qEnsWotcJHQp|4gJ@R^B zpN%W&k2f#*IvNtIbfsE1u(CtAsvWqR=+3P#`PhP%qsQnc= 3: + break +def quitTkinter(): + #exits Tkinter gui and continues with code execution after mainloop() + #global app + app.update() #see https://stackoverflow.com/questions/35040168/python-tkinter-error-cant-evoke-event-command + app.quit() ##root.quit() causes mainloop to exit, see https://stackoverflow.com/questions/2307464/what-is-the-difference-between-root-destroy-and-root-quit + +#def vis_tag(tag): + +def sel_photos(tag,cleanedPhotoList): + #select photos from list based on a specific tag + distinctLocalLocationCount = set() + selectedPhotoList = [] + for cleanedPhotoLocation in cleanedPhotoList: + if tag in (cleanedPhotoLocation.photo_tags) or (tag in cleanedPhotoLocation.photo_caption): + selectedPhotoList.append(cleanedPhotoLocation) + distinctLocalLocationCount.add(cleanedPhotoLocation.photo_locID) + return selectedPhotoList, len(distinctLocalLocationCount) + +def cluster_tag(toptag,preview=None): + if preview is None: + preview = False + global first + global currentDisplayTag + global limYMin, limYMax, limXMin, limXMax, distY, distX, imgRatio, floaterX, floaterY + global graphFrame + global fig1, fig2, fig3, fig4 + + if graphFrame: #if + graphFrame.destroy() + graphFrame = tk.Frame(app.floater) + canvas = tk.Canvas(graphFrame, width=canvasWidth, height=canvasHeight, highlightthickness=0,background="gray7") + l = tk.Label(canvas, text="Preview Map", background="gray7",fg="gray80",font="Arial 10 bold") + l.pack() + selectedPhotoList, distinctLocalLocationCount = sel_photos(toptag[0],cleanedPhotoList) + percentageOfTotalLocations = distinctLocalLocationCount/(total_distinct_locations/100) + print("(" + str(tnum) + " of " + str(tmax) + ") Found " + str(len(selectedPhotoList)) + " photos for tag " + "'" + toptag[0] + "' (" + str(round(percentageOfTotalLocations,0)) + "% of total distinct locations in area)") + #clustering + df = pd.DataFrame(selectedPhotoList) + points = df.as_matrix(['lng','lat']) #converts pandas data to numpy array (limit by list of column-names) + + #only return preview fig without clustering + if preview == True: + #only map data + if fig1: + plt.figure(1).clf() #clear figure 1 + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + #reuse window of figure 1 for new figure + plt.scatter(points.T[0], points.T[1], color='red', **plot_kwds) + fig1.canvas.set_window_title('Preview Map') + #displayImgPath = pathname + '/Output/ClusterImg/00_displayImg.png' + #fig1.figure.savefig(displayImgPath) + else: + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + plt.scatter(points.T[0], points.T[1], color='red', **plot_kwds) + fig1 = plt.figure(num=1,figsize=(11, int(11*imgRatio)), dpi=80) + fig1.canvas.set_window_title('Preview Map') + plt.tick_params(labelsize=10) + currentDisplayTag = toptag + else: + #cluster data + tagRadiansData = np.radians(points) #conversion to radians for HDBSCAN (does not support decimal degrees) #for each tag in overallNumOfUsersPerTag_global.most_common(1000) (descending), calculate HDBSCAN Clusters minClusterSize = int(((len(selectedPhotoList))/100)*5) #4% optimum #minClusterSize = 2 clusterer = hdbscan.HDBSCAN(min_cluster_size=minClusterSize,gen_min_span_tree=True,allow_single_cluster=True,min_samples=1) #clusterer = hdbscan.robust_single_linkage_.RobustSingleLinkage(cut=0.000035) #srsl_plt = hdbscan.robust_single_linkage_.plot() - clusterer.fit(test_data) - sel_labels = clusterer.single_linkage_tree_.get_clusters(0.000035, min_cluster_size=2) #0.000035 without haversine: 223 m (or 95 m for 0.000015) + clusterer.fit(tagRadiansData) + sel_labels = clusterer.single_linkage_tree_.get_clusters(getRadiansFromMeters(clusterTreeCuttingDist), min_cluster_size=2) #0.000035 without haversine: 223 m (or 95 m for 0.000015) #if toptag[0] == "water": # print(sel_labels) palette = sns.color_palette(None, len(sel_labels)) #sns.color_palette("hls", ) #sns.color_palette(None, 100) @@ -653,112 +741,119 @@ def cluster_tag(toptag): else (0.5, 0.5, 0.5) #for x in clusterer.labels_ ] for x in sel_labels] #clusterer.labels_ (best selection) or sel_labels (cut distance) - if tnum < 20: - fig = plt.figure(figsize=(11, int(11*imgRatio)), dpi=80) - fig.suptitle(toptag[0].upper(), fontsize=24, fontweight='bold') - fig = plt.scatter(points.T[0], points.T[1], color='red', **plot_kwds) - fig.figure.savefig(pathname + '/Output/ClusterImg/graph_' + "%04d" % (tnum,) + '.png') - fig2 = plt.figure(figsize=(11, 11), dpi=80) - fig2.suptitle(toptag[0].upper(), fontsize=24, fontweight='bold') - #selected clusters herin don't match get_clusters at cut = 0.000035!! + #output/update matplotlib figures + if fig1: + plt.figure(1).clf() + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') #plt references the last figure accessed + plt.scatter(points.T[0], points.T[1], color=sel_colors, **plot_kwds) + fig1.canvas.set_window_title('Cluster Preview') + else: + plt.scatter(points.T[0], points.T[1], c=sel_colors, **plot_kwds) + fig1 = plt.figure(num=1,figsize=(11, int(11*imgRatio)), dpi=80) + fig1.canvas.set_window_title('Cluster Preview') + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + plt.tick_params(labelsize=10) + if fig2: + plt.figure(2).clf() + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + clusterer.condensed_tree_.plot(select_clusters=False, selection_palette=sel_colors,label_clusters=True) + else: + plt.figure(2).canvas.set_window_title('Condensed Tree') fig2 = clusterer.condensed_tree_.plot(select_clusters=False, selection_palette=sel_colors,label_clusters=True) - fig2.figure.savefig(pathname + '/Output/ClusterImg/graph_' + "%04d" % (tnum,) + '_clusterTree.png') - fig3 = plt.figure(figsize=(11, 11), dpi=80) - fig3.suptitle(toptag[0].upper(), fontsize=24, fontweight='bold') + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + plt.tick_params(labelsize=10) + if fig3: + plt.figure(3).clf() + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + clusterer.single_linkage_tree_.plot(truncate_mode='lastp',p=50) + else: + plt.figure(3).canvas.set_window_title('Single Linkage Tree') fig3 = clusterer.single_linkage_tree_.plot(truncate_mode='lastp',p=50) - fig3.figure.savefig(pathname + '/Output/ClusterImg/graph_' + "%04d" % (tnum,) + '_Tree.png') - #create map with cluster-colors from cut - fig4 = plt.figure(figsize=(11, int(11*imgRatio)), dpi=80) - fig4.suptitle(toptag[0].upper(), fontsize=24, fontweight='bold') - fig4 = plt.scatter(points.T[0], points.T[1], c=sel_colors, **plot_kwds) - fig4.figure.savefig(pathname + '/Output/ClusterImg/graph_' + "%04d" % (tnum,) + '_cluster.png') + plt.suptitle(toptag[0].upper(), fontsize=18, fontweight='bold') + plt.tick_params(labelsize=10) - #first tag, train cut distance by human observer - if tnum == 1: - #.configure(background='gray7') - def quitTkinter(): - global app - app.update() #see https://stackoverflow.com/questions/35040168/python-tkinter-error-cant-evoke-event-command - app.quit() #root.quit() causes mainloop to exit, see https://stackoverflow.com/questions/2307464/what-is-the-difference-between-root-destroy-and-root-quit - - l = tk.Label(canvas, text="Optional: Exclude tags.", background="gray7",fg="gray80",font="Arial 10 bold") - l.pack(padx=10, pady=10) - l = tk.Label(canvas, text="Select all tags you wish to exclude from analysis \n and click on remove to proceed.", background="gray7",fg="gray80") - l.pack(padx=10, pady=10) - image = tk.PhotoImage(file=pathname + '/Output/ClusterImg/graph_' + "%04d" % (tnum,) + '_cluster.png') - label = tk.Label(canvas,image=image,background="gray29",fg="gray91") - label.pack() - #listbox = Listbox(canvas,selectmode=MULTIPLE, bd=0,background="gray29",fg="gray91") - #listbox.pack() - #for item in topTagsList[:100]: #only for first 100 entries - # listbox.insert(END, item[0] + " ("+ str(item[1]) + " photos)") - b = tk.Button(canvas, text = "Proceed", command=quitTkinter, background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") - b.pack(padx=10, pady=10) - #adjust location of floater (center) - - #commit - canvas.pack(fill='both',padx=0, pady=0) - frame.pack(fill='both',padx=0, pady=0) - #app.pack() - app.update() - - frame = tk.Frame(app.floater) - canvas = tk.Canvas(frame, width=1320, height=440, highlightthickness=0,background="gray7") - w = 1320#app.floater.winfo_reqwidth() - h = 440#app.floater.winfo_reqheight() - ws = app.winfo_screenwidth() - hs = app.winfo_screenheight() - x = (ws/2) - (w/2) - y = (hs/2) - (h/2) - app.floater.geometry('+%d+%d' % (x, y)) - #app.title("Select Cluster Distance") - l = tk.Label(canvas, text="########## STEP 3 of 4: Tag Location Clustering ##########", background="gray7",fg="gray80") - l.pack() - #Cluster preparation - sns.set_context('poster') - sns.set_style('white') - sns.set_color_codes() - matplotlib.style.use('ggplot') - #photo selection - for toptag in topTagsList: - tnum += 1 - cluster_tag(toptag) - #plt.close() - if tnum > 3: - break - #plt.close('all') #clear memory +def getRadiansFromMeters(dist): + dist = dist/1000 + degreesDist = dist/111.325 + radiansDist = degreesDist/57.2958 + return radiansDist + #1 Radian is about 57.2958 degrees. + #then see https://sciencing.com/convert-distances-degrees-meters-7858322.html + #Multiply the number of degrees by 111.325 + #To convert this to meters, multiply by 1,000. So, 2 degrees is 222,65 meters. + #plt.close('all') #clear memory +def change_clusterDist(val): + #tkinter.messagebox.showinfo("messagr", val) + global clusterTreeCuttingDist + clusterTreeCuttingDist = float(val)#tkScalebar.get() + +def onselect(evt): + # Note here that Tkinter passes an event object to onselect() + global lastselectionList + global tnum + w = evt.widget + if lastselectionList: #if not empty + changedSelection = set(lastselectionList).symmetric_difference(set(w.curselection())) + lastselectionList = w.curselection() + else: + lastselectionList = w.curselection() + changedSelection = w.curselection() + index = int(list(changedSelection)[0]) + value = w.get(index) + #tkinter.messagebox.showinfo("You selected ", value) + tnum = 1 + cluster_tag(topTagsList[index],True) #generate only preview map + #plt.close('all') +def cluster_currentDisplayTag(): + if currentDisplayTag: + cluster_tag(currentDisplayTag) + else: + cluster_tag(topTagsList[0]) + #plt.close('all') +def delete(listbox): + global topTagsList + global lastselectionList + lastselectionList = [] + # Delete from Listbox + selection = listbox.curselection() + #tkinter.messagebox.showinfo("listbox.curselection()", str(selection)) + for index in selection[::-1]: + listbox.delete(index) + del(topTagsList[index]) +def proceedClusterAllTags(): + #global listboxFrame + listboxFrame.destroy() + cluster_tags() + quitTkinter() ###################################################################################################################################################### ###################################################################################################################################################### ###################################################################################################################################################### #A frame is created for each window/part of the gui; after it is used, it is destroyed with frame.destroy() -frame = tk.Frame(app.floater) -canvas = tk.Canvas(frame, width=150, height=400, highlightthickness=0,background="gray7") +listboxFrame = tk.Frame(app.floater) +canvas = tk.Canvas(listboxFrame, width=150, height=400, highlightthickness=0,background="gray7") l = tk.Label(canvas, text="Optional: Exclude tags.", background="gray7",fg="gray80",font="Arial 10 bold") l.pack(padx=10, pady=10) l = tk.Label(canvas, text="Select all tags you wish to exclude from analysis \n and click on remove to proceed.", background="gray7",fg="gray80") l.pack(padx=10, pady=10) listbox = tk.Listbox(canvas,selectmode=tk.MULTIPLE, bd=0,background="gray29",fg="gray91") +listbox.bind('<>', onselect) listbox.pack() for item in topTagsList[:100]: #only for first 100 entries listbox.insert(tk.END, item[0] + " ("+ str(item[1]) + " photos)") -#tagsRemoved = False -def delete(listbox): - global topTagsList - global tagsRemoved - global cluster_tags - global frame - # Delete from Listbox - selection = listbox.curselection() - for index in selection[::-1]: - listbox.delete(index) - del(topTagsList[index]) - frame.destroy() - cluster_tags() -b = tk.Button(canvas, text = "Remove and Proceed", command = lambda: delete(listbox), background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") +b = tk.Button(canvas, text = "Remove Tag(s)", command = lambda: delete(listbox), background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") +b.pack(padx=10, pady=10) +tkScalebar = tk.Scale(canvas, from_=(clusterTreeCuttingDist/100), to=(clusterTreeCuttingDist*2), orient=tk.HORIZONTAL,resolution=0.1,command=change_clusterDist,length=400) +tkScalebar.set(clusterTreeCuttingDist)#(clusterTreeCuttingDist*10) - (clusterTreeCuttingDist/10)/2) #set position of slider to center +tkScalebar.pack() +b = tk.Button(canvas, text = "Cluster Preview", command=cluster_currentDisplayTag, background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") +b.pack(padx=10, pady=10) +b = tk.Button(canvas, text = "Proceed", command = proceedClusterAllTags, background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") +b.pack(padx=10, pady=10) +b = tk.Button(canvas, text = "Quit", command=quitTkinter, background="gray20",fg="gray80",borderwidth=0,font="Arial 10 bold") b.pack(padx=10, pady=10) canvas.pack(fill='both',padx=0, pady=0) -frame.pack(fill='both',padx=0, pady=0) +listboxFrame.pack(fill='both',padx=0, pady=0) #end of tkinter main loop app.mainloop() diff --git a/matplotlibrc b/matplotlibrc new file mode 100644 index 0000000..a2d78d7 --- /dev/null +++ b/matplotlibrc @@ -0,0 +1,620 @@ +### MATPLOTLIBRC FORMAT + +# This is a sample matplotlib configuration file - you can find a copy +# of it on your system in +# site-packages/matplotlib/mpl-data/matplotlibrc. If you edit it +# there, please note that it will be overwritten in your next install. +# If you want to keep a permanent local copy that will not be +# overwritten, place it in the following location: +# unix/linux: +# $HOME/.config/matplotlib/matplotlibrc or +# $XDG_CONFIG_HOME/matplotlib/matplotlibrc (if $XDG_CONFIG_HOME is set) +# other platforms: +# $HOME/.matplotlib/matplotlibrc +# +# See http://matplotlib.org/users/customizing.html#the-matplotlibrc-file for +# more details on the paths which are checked for the configuration file. +# +# This file is best viewed in a editor which supports python mode +# syntax highlighting. Blank lines, or lines starting with a comment +# symbol, are ignored, as are trailing comments. Other lines must +# have the format +# key : val # optional comment +# +# Colors: for the color values below, you can either use - a +# matplotlib color string, such as r, k, or b - an rgb tuple, such as +# (1.0, 0.5, 0.0) - a hex string, such as ff00ff - a scalar +# grayscale intensity such as 0.75 - a legal html color name, e.g., red, +# blue, darkslategray + +#### CONFIGURATION BEGINS HERE + +# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo +# MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG +# Template. +# You can also deploy your own backend outside of matplotlib by +# referring to the module name (which must be in the PYTHONPATH) as +# 'module://my_backend'. +# +# If you omit this parameter, it will always default to "Agg", which is a +# non-interactive backend. +backend : TkAgg + +# If you are using the Qt4Agg backend, you can choose here +# to use the PyQt4 bindings or the newer PySide bindings to +# the underlying Qt4 toolkit. +#backend.qt4 : PyQt4 # PyQt4 | PySide + +# Note that this can be overridden by the environment variable +# QT_API used by Enthought Tool Suite (ETS); valid values are +# "pyqt" and "pyside". The "pyqt" setting has the side effect of +# forcing the use of Version 2 API for QString and QVariant. + +# The port to use for the web server in the WebAgg backend. +# webagg.port : 8888 + +# If webagg.port is unavailable, a number of other random ports will +# be tried until one that is available is found. +# webagg.port_retries : 50 + +# When True, open the webbrowser to the plot that is shown +# webagg.open_in_browser : True + +# When True, the figures rendered in the nbagg backend are created with +# a transparent background. +# nbagg.transparent : False + +# if you are running pyplot inside a GUI and your backend choice +# conflicts, we will automatically try to find a compatible one for +# you if backend_fallback is True +#backend_fallback: True + +interactive : True +#toolbar : toolbar2 # None | toolbar2 ("classic" is deprecated) +#timezone : UTC # a pytz timezone string, e.g., US/Central or Europe/Paris + +# Where your matplotlib data lives if you installed to a non-default +# location. This is where the matplotlib fonts, bitmaps, etc reside +#datapath : /home/jdhunter/mpldata + + +### LINES +# See http://matplotlib.org/api/artist_api.html#module-matplotlib.lines for more +# information on line properties. +#lines.linewidth : 1.5 # line width in points +#lines.linestyle : - # solid line +#lines.color : C0 # has no affect on plot(); see axes.prop_cycle +#lines.marker : None # the default marker +#lines.markeredgewidth : 1.0 # the line width around the marker symbol +#lines.markersize : 6 # markersize, in points +#lines.dash_joinstyle : miter # miter|round|bevel +#lines.dash_capstyle : butt # butt|round|projecting +#lines.solid_joinstyle : miter # miter|round|bevel +#lines.solid_capstyle : projecting # butt|round|projecting +#lines.antialiased : True # render lines in antialiased (no jaggies) + +# The three standard dash patterns. These are scaled by the linewidth. +#lines.dashed_pattern : 2.8, 1.2 +#lines.dashdot_pattern : 4.8, 1.2, 0.8, 1.2 +#lines.dotted_pattern : 1.1, 1.1 +#lines.scale_dashes : True + +#markers.fillstyle: full # full|left|right|bottom|top|none + +### PATCHES +# Patches are graphical objects that fill 2D space, like polygons or +# circles. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.patches +# information on patch properties +#patch.linewidth : 1 # edge width in points. +#patch.facecolor : C0 +#patch.edgecolor : black # if forced, or patch is not filled +#patch.force_edgecolor : False # True to always use edgecolor +#patch.antialiased : True # render patches in antialiased (no jaggies) + +### HATCHES +#hatch.color : k +#hatch.linewidth : 1.0 + +### Boxplot +#boxplot.notch : False +#boxplot.vertical : True +#boxplot.whiskers : 1.5 +#boxplot.bootstrap : None +#boxplot.patchartist : False +#boxplot.showmeans : False +#boxplot.showcaps : True +#boxplot.showbox : True +#boxplot.showfliers : True +#boxplot.meanline : False + +#boxplot.flierprops.color : 'k' +#boxplot.flierprops.marker : 'o' +#boxplot.flierprops.markerfacecolor : 'none' +#boxplot.flierprops.markeredgecolor : 'k' +#boxplot.flierprops.markersize : 6 +#boxplot.flierprops.linestyle : 'none' +#boxplot.flierprops.linewidth : 1.0 + +#boxplot.boxprops.color : 'k' +#boxplot.boxprops.linewidth : 1.0 +#boxplot.boxprops.linestyle : '-' + +#boxplot.whiskerprops.color : 'k' +#boxplot.whiskerprops.linewidth : 1.0 +#boxplot.whiskerprops.linestyle : '-' + +#boxplot.capprops.color : 'k' +#boxplot.capprops.linewidth : 1.0 +#boxplot.capprops.linestyle : '-' + +#boxplot.medianprops.color : 'C1' +#boxplot.medianprops.linewidth : 1.0 +#boxplot.medianprops.linestyle : '-' + +#boxplot.meanprops.color : 'C2' +#boxplot.meanprops.marker : '^' +#boxplot.meanprops.markerfacecolor : 'C2' +#boxplot.meanprops.markeredgecolor : 'C2' +#boxplot.meanprops.markersize : 6 +#boxplot.meanprops.linestyle : 'none' +#boxplot.meanprops.linewidth : 1.0 + +### FONT +# +# font properties used by text.Text. See +# http://matplotlib.org/api/font_manager_api.html for more +# information on font properties. The 6 font properties used for font +# matching are given below with their default values. +# +# The font.family property has five values: 'serif' (e.g., Times), +# 'sans-serif' (e.g., Helvetica), 'cursive' (e.g., Zapf-Chancery), +# 'fantasy' (e.g., Western), and 'monospace' (e.g., Courier). Each of +# these font families has a default list of font names in decreasing +# order of priority associated with them. When text.usetex is False, +# font.family may also be one or more concrete font names. +# +# The font.style property has three values: normal (or roman), italic +# or oblique. The oblique style will be used for italic, if it is not +# present. +# +# The font.variant property has two values: normal or small-caps. For +# TrueType fonts, which are scalable fonts, small-caps is equivalent +# to using a font size of 'smaller', or about 83%% of the current font +# size. +# +# The font.weight property has effectively 13 values: normal, bold, +# bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as +# 400, and bold is 700. bolder and lighter are relative values with +# respect to the current weight. +# +# The font.stretch property has 11 values: ultra-condensed, +# extra-condensed, condensed, semi-condensed, normal, semi-expanded, +# expanded, extra-expanded, ultra-expanded, wider, and narrower. This +# property is not currently implemented. +# +# The font.size property is the default font size for text, given in pts. +# 10 pt is the standard value. +# +#font.family : sans-serif +#font.style : normal +#font.variant : normal +#font.weight : medium +#font.stretch : normal +# note that font.size controls default text sizes. To configure +# special text sizes tick labels, axes, labels, title, etc, see the rc +# settings for axes and ticks. Special text sizes can be defined +# relative to font.size, using the following values: xx-small, x-small, +# small, medium, large, x-large, xx-large, larger, or smaller +#font.size : 10.0 +#font.serif : DejaVu Serif, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif +#font.sans-serif : DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif +#font.cursive : Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive +#font.fantasy : Comic Sans MS, Chicago, Charcoal, Impact, Western, Humor Sans, xkcd, fantasy +#font.monospace : DejaVu Sans Mono, Bitstream Vera Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace + +### TEXT +# text properties used by text.Text. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.text for more +# information on text properties + +#text.color : black + +### LaTeX customizations. See http://wiki.scipy.org/Cookbook/Matplotlib/UsingTex +#text.usetex : False # use latex for all text handling. The following fonts + # are supported through the usual rc parameter settings: + # new century schoolbook, bookman, times, palatino, + # zapf chancery, charter, serif, sans-serif, helvetica, + # avant garde, courier, monospace, computer modern roman, + # computer modern sans serif, computer modern typewriter + # If another font is desired which can loaded using the + # LaTeX \usepackage command, please inquire at the + # matplotlib mailing list +#text.latex.unicode : False # use "ucs" and "inputenc" LaTeX packages for handling + # unicode strings. +#text.latex.preamble : # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES + # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP + # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO. + # preamble is a comma separated list of LaTeX statements + # that are included in the LaTeX document preamble. + # An example: + # text.latex.preamble : \usepackage{bm},\usepackage{euler} + # The following packages are always loaded with usetex, so + # beware of package collisions: color, geometry, graphicx, + # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages + # may also be loaded, depending on your font settings +#text.hinting : auto # May be one of the following: + # 'none': Perform no hinting + # 'auto': Use FreeType's autohinter + # 'native': Use the hinting information in the + # font file, if available, and if your + # FreeType library supports it + # 'either': Use the native hinting information, + # or the autohinter if none is available. + # For backward compatibility, this value may also be + # True === 'auto' or False === 'none'. +#text.hinting_factor : 8 # Specifies the amount of softness for hinting in the + # horizontal direction. A value of 1 will hint to full + # pixels. A value of 2 will hint to half pixels etc. + +#text.antialiased : True # If True (default), the text will be antialiased. + # This only affects the Agg backend. + +# The following settings allow you to select the fonts in math mode. +# They map from a TeX font name to a fontconfig font pattern. +# These settings are only used if mathtext.fontset is 'custom'. +# Note that this "custom" mode is unsupported and may go away in the +# future. +#mathtext.cal : cursive +#mathtext.rm : serif +#mathtext.tt : monospace +#mathtext.it : serif:italic +#mathtext.bf : serif:bold +#mathtext.sf : sans +#mathtext.fontset : dejavusans # Should be 'dejavusans' (default), + # 'dejavuserif', 'cm' (Computer Modern), 'stix', + # 'stixsans' or 'custom' +#mathtext.fallback_to_cm : True # When True, use symbols from the Computer Modern + # fonts when a symbol can not be found in one of + # the custom math fonts. + +#mathtext.default : it # The default font to use for math. + # Can be any of the LaTeX font names, including + # the special name "regular" for the same font + # used in regular text. + +### AXES +# default face and edge color, default tick sizes, +# default fontsizes for ticklabels, and so on. See +# http://matplotlib.org/api/axes_api.html#module-matplotlib.axes +#axes.facecolor : white # axes background color +#axes.edgecolor : black # axes edge color +#axes.linewidth : 0.8 # edge linewidth +#axes.grid : False # display grid or not +#axes.titlesize : large # fontsize of the axes title +#axes.titlepad : 6.0 # pad between axes and title in points +#axes.labelsize : medium # fontsize of the x any y labels +#axes.labelpad : 4.0 # space between label and axis +#axes.labelweight : normal # weight of the x and y labels +#axes.labelcolor : black +#axes.axisbelow : 'line' # draw axis gridlines and ticks below + # patches (True); above patches but below + # lines ('line'); or above all (False) + +#axes.formatter.limits : -7, 7 # use scientific notation if log10 + # of the axis range is smaller than the + # first or larger than the second +#axes.formatter.use_locale : False # When True, format tick labels + # according to the user's locale. + # For example, use ',' as a decimal + # separator in the fr_FR locale. +#axes.formatter.use_mathtext : False # When True, use mathtext for scientific + # notation. +#axes.formatter.min_exponent: 0 # minimum exponent to format in scientific notation +#axes.formatter.useoffset : True # If True, the tick label formatter + # will default to labeling ticks relative + # to an offset when the data range is + # small compared to the minimum absolute + # value of the data. +#axes.formatter.offset_threshold : 4 # When useoffset is True, the offset + # will be used when it can remove + # at least this number of significant + # digits from tick labels. + +# axes.spines.left : True # display axis spines +# axes.spines.bottom : True +# axes.spines.top : True +# axes.spines.right : True + + +#axes.unicode_minus : True # use unicode for the minus symbol + # rather than hyphen. See + # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes +# axes.prop_cycle : cycler('color', ['1f77b4', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf']) + # color cycle for plot lines as list of string + # colorspecs: single letter, long name, or web-style hex +#axes.autolimit_mode : data # How to scale axes limits to the data. + # Use "data" to use data limits, plus some margin + # Use "round_number" move to the nearest "round" number +#axes.xmargin : .05 # x margin. See `axes.Axes.margins` +#axes.ymargin : .05 # y margin See `axes.Axes.margins` + +#polaraxes.grid : True # display grid on polar axes +#axes3d.grid : True # display grid on 3d axes + +### DATES +# These control the default format strings used in AutoDateFormatter. +# Any valid format datetime format string can be used (see the python +# `datetime` for details). For example using '%%x' will use the locale date representation +# '%%X' will use the locale time representation and '%%c' will use the full locale datetime +# representation. +# These values map to the scales: +# {'year': 365, 'month': 30, 'day': 1, 'hour': 1/24, 'minute': 1 / (24 * 60)} + +# date.autoformatter.year : %Y +# date.autoformatter.month : %Y-%m +# date.autoformatter.day : %Y-%m-%d +# date.autoformatter.hour : %m-%d %H +# date.autoformatter.minute : %d %H:%M +# date.autoformatter.second : %H:%M:%S +# date.autoformatter.microsecond : %M:%S.%f + +### TICKS +# see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick +#xtick.top : False # draw ticks on the top side +#xtick.bottom : True # draw ticks on the bottom side +#xtick.major.size : 3.5 # major tick size in points +#xtick.minor.size : 2 # minor tick size in points +#xtick.major.width : 0.8 # major tick width in points +#xtick.minor.width : 0.6 # minor tick width in points +#xtick.major.pad : 3.5 # distance to major tick label in points +#xtick.minor.pad : 3.4 # distance to the minor tick label in points +#xtick.color : k # color of the tick labels +#xtick.labelsize : medium # fontsize of the tick labels +#xtick.direction : out # direction: in, out, or inout +#xtick.minor.visible : False # visibility of minor ticks on x-axis +#xtick.major.top : True # draw x axis top major ticks +#xtick.major.bottom : True # draw x axis bottom major ticks +#xtick.minor.top : True # draw x axis top minor ticks +#xtick.minor.bottom : True # draw x axis bottom minor ticks + +#ytick.left : True # draw ticks on the left side +#ytick.right : False # draw ticks on the right side +#ytick.major.size : 3.5 # major tick size in points +#ytick.minor.size : 2 # minor tick size in points +#ytick.major.width : 0.8 # major tick width in points +#ytick.minor.width : 0.6 # minor tick width in points +#ytick.major.pad : 3.5 # distance to major tick label in points +#ytick.minor.pad : 3.4 # distance to the minor tick label in points +#ytick.color : k # color of the tick labels +#ytick.labelsize : medium # fontsize of the tick labels +#ytick.direction : out # direction: in, out, or inout +#ytick.minor.visible : False # visibility of minor ticks on y-axis +#ytick.major.left : True # draw y axis left major ticks +#ytick.major.right : True # draw y axis right major ticks +#ytick.minor.left : True # draw y axis left minor ticks +#ytick.minor.right : True # draw y axis right minor ticks + + +### GRIDS +#grid.color : b0b0b0 # grid color +#grid.linestyle : - # solid +#grid.linewidth : 0.8 # in points +#grid.alpha : 1.0 # transparency, between 0.0 and 1.0 + +### Legend +#legend.loc : best +#legend.frameon : True # if True, draw the legend on a background patch +#legend.framealpha : 0.8 # legend patch transparency +#legend.facecolor : inherit # inherit from axes.facecolor; or color spec +#legend.edgecolor : 0.8 # background patch boundary color +#legend.fancybox : True # if True, use a rounded box for the + # legend background, else a rectangle +#legend.shadow : False # if True, give background a shadow effect +#legend.numpoints : 1 # the number of marker points in the legend line +#legend.scatterpoints : 1 # number of scatter points +#legend.markerscale : 1.0 # the relative size of legend markers vs. original +#legend.fontsize : medium +# Dimensions as fraction of fontsize: +#legend.borderpad : 0.4 # border whitespace +#legend.labelspacing : 0.5 # the vertical space between the legend entries +#legend.handlelength : 2.0 # the length of the legend lines +#legend.handleheight : 0.7 # the height of the legend handle +#legend.handletextpad : 0.8 # the space between the legend line and legend text +#legend.borderaxespad : 0.5 # the border between the axes and legend edge +#legend.columnspacing : 2.0 # column separation + +### FIGURE +# See http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure +#figure.titlesize : large # size of the figure title (Figure.suptitle()) +#figure.titleweight : normal # weight of the figure title +#figure.figsize : 6.4, 4.8 # figure size in inches +#figure.dpi : 100 # figure dots per inch +#figure.facecolor : white # figure facecolor; 0.75 is scalar gray +#figure.edgecolor : white # figure edgecolor +#figure.autolayout : False # When True, automatically adjust subplot + # parameters to make the plot fit the figure +#figure.max_open_warning : 20 # The maximum number of figures to open through + # the pyplot interface before emitting a warning. + # If less than one this feature is disabled. + +# The figure subplot parameters. All dimensions are a fraction of the +#figure.subplot.left : 0.125 # the left side of the subplots of the figure +#figure.subplot.right : 0.9 # the right side of the subplots of the figure +#figure.subplot.bottom : 0.11 # the bottom of the subplots of the figure +#figure.subplot.top : 0.88 # the top of the subplots of the figure +#figure.subplot.wspace : 0.2 # the amount of width reserved for blank space between subplots, + # expressed as a fraction of the average axis width +#figure.subplot.hspace : 0.2 # the amount of height reserved for white space between subplots, + # expressed as a fraction of the average axis height + + +### IMAGES +#image.aspect : equal # equal | auto | a number +#image.interpolation : nearest # see help(imshow) for options +#image.cmap : viridis # A colormap name, gray etc... +#image.lut : 256 # the size of the colormap lookup table +#image.origin : upper # lower | upper +#image.resample : True +#image.composite_image : True # When True, all the images on a set of axes are + # combined into a single composite image before + # saving a figure as a vector graphics file, + # such as a PDF. + +### CONTOUR PLOTS +#contour.negative_linestyle : dashed # string or on-off ink sequence +#contour.corner_mask : True # True | False | legacy + +### ERRORBAR PLOTS +#errorbar.capsize : 0 # length of end cap on error bars in pixels + +### HISTOGRAM PLOTS +#hist.bins : 10 # The default number of histogram bins. + # If Numpy 1.11 or later is + # installed, may also be `auto` + +### SCATTER PLOTS +#scatter.marker : o # The default marker type for scatter plots. + +### Agg rendering +### Warning: experimental, 2008/10/10 +#agg.path.chunksize : 0 # 0 to disable; values in the range + # 10000 to 100000 can improve speed slightly + # and prevent an Agg rendering failure + # when plotting very large data sets, + # especially if they are very gappy. + # It may cause minor artifacts, though. + # A value of 20000 is probably a good + # starting point. +### SAVING FIGURES +#path.simplify : True # When True, simplify paths by removing "invisible" + # points to reduce file size and increase rendering + # speed +#path.simplify_threshold : 0.1 # The threshold of similarity below which + # vertices will be removed in the simplification + # process +#path.snap : True # When True, rectilinear axis-aligned paths will be snapped to + # the nearest pixel when certain criteria are met. When False, + # paths will never be snapped. +#path.sketch : None # May be none, or a 3-tuple of the form (scale, length, + # randomness). + # *scale* is the amplitude of the wiggle + # perpendicular to the line (in pixels). *length* + # is the length of the wiggle along the line (in + # pixels). *randomness* is the factor by which + # the length is randomly scaled. + +# the default savefig params can be different from the display params +# e.g., you may want a higher resolution, or to make the figure +# background white +#savefig.dpi : figure # figure dots per inch or 'figure' +#savefig.facecolor : white # figure facecolor when saving +#savefig.edgecolor : white # figure edgecolor when saving +#savefig.format : png # png, ps, pdf, svg +#savefig.bbox : standard # 'tight' or 'standard'. + # 'tight' is incompatible with pipe-based animation + # backends but will workd with temporary file based ones: + # e.g. setting animation.writer to ffmpeg will not work, + # use ffmpeg_file instead +#savefig.pad_inches : 0.1 # Padding to be used when bbox is set to 'tight' +#savefig.jpeg_quality: 95 # when a jpeg is saved, the default quality parameter. +#savefig.directory : ~ # default directory in savefig dialog box, + # leave empty to always use current working directory +#savefig.transparent : False # setting that controls whether figures are saved with a + # transparent background by default + +# tk backend params +#tk.window_focus : False # Maintain shell focus for TkAgg + +# ps backend params +#ps.papersize : letter # auto, letter, legal, ledger, A0-A10, B0-B10 +#ps.useafm : False # use of afm fonts, results in small files +#ps.usedistiller : False # can be: None, ghostscript or xpdf + # Experimental: may produce smaller files. + # xpdf intended for production of publication quality files, + # but requires ghostscript, xpdf and ps2eps +#ps.distiller.res : 6000 # dpi +#ps.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) + +# pdf backend params +#pdf.compression : 6 # integer from 0 to 9 + # 0 disables compression (good for debugging) +#pdf.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) + +# svg backend params +#svg.image_inline : True # write raster image data directly into the svg file +#svg.fonttype : 'path' # How to handle SVG fonts: +# 'none': Assume fonts are installed on the machine where the SVG will be viewed. +# 'path': Embed characters as paths -- supported by most SVG renderers +# 'svgfont': Embed characters as SVG fonts -- supported only by Chrome, +# Opera and Safari +#svg.hashsalt : None # if not None, use this string as hash salt + # instead of uuid4 + +# docstring params +#docstring.hardcopy = False # set this when you want to generate hardcopy docstring + +# Set the verbose flags. This controls how much information +# matplotlib gives you at runtime and where it goes. The verbosity +# levels are: silent, helpful, debug, debug-annoying. Any level is +# inclusive of all the levels below it. If your setting is "debug", +# you'll get all the debug and helpful messages. When submitting +# problems to the mailing-list, please set verbose to "helpful" or "debug" +# and paste the output into your report. +# +# The "fileo" gives the destination for any calls to verbose.report. +# These objects can a filename, or a filehandle like sys.stdout. +# +# You can override the rc default verbosity from the command line by +# giving the flags --verbose-LEVEL where LEVEL is one of the legal +# levels, e.g., --verbose-helpful. +# +# You can access the verbose instance in your code +# from matplotlib import verbose. +#verbose.level : silent # one of silent, helpful, debug, debug-annoying +#verbose.fileo : sys.stdout # a log filename, sys.stdout or sys.stderr + +# Event keys to interact with figures/plots via keyboard. +# Customize these settings according to your needs. +# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '') + +#keymap.fullscreen : f, ctrl+f # toggling +#keymap.home : h, r, home # home or reset mnemonic +#keymap.back : left, c, backspace # forward / backward keys to enable +#keymap.forward : right, v # left handed quick navigation +#keymap.pan : p # pan mnemonic +#keymap.zoom : o # zoom mnemonic +#keymap.save : s # saving current figure +#keymap.quit : ctrl+w, cmd+w # close the current figure +#keymap.grid : g # switching on/off major grids in current axes +#keymap.grid_minor : G # switching on/off minor grids in current axes +#keymap.yscale : l # toggle scaling of y-axes ('log'/'linear') +#keymap.xscale : L, k # toggle scaling of x-axes ('log'/'linear') +#keymap.all_axes : a # enable all axes + +# Control location of examples data files +#examples.directory : '' # directory to look in for custom installation + +###ANIMATION settings +#animation.html : 'none' # How to display the animation as HTML in + # the IPython notebook. 'html5' uses + # HTML5 video tag. +#animation.writer : ffmpeg # MovieWriter 'backend' to use +#animation.codec : h264 # Codec to use for writing movie +#animation.bitrate: -1 # Controls size/quality tradeoff for movie. + # -1 implies let utility auto-determine +#animation.frame_format: 'png' # Controls frame format used by temp files +#animation.html_args: '' # Additional arguments to pass to html writer +#animation.ffmpeg_path: 'ffmpeg' # Path to ffmpeg binary. Without full path + # $PATH is searched +#animation.ffmpeg_args: '' # Additional arguments to pass to ffmpeg +#animation.avconv_path: 'avconv' # Path to avconv binary. Without full path + # $PATH is searched +#animation.avconv_args: '' # Additional arguments to pass to avconv +#animation.mencoder_path: 'mencoder' + # Path to mencoder binary. Without full path + # $PATH is searched +#animation.mencoder_args: '' # Additional arguments to pass to mencoder +#animation.convert_path: 'convert' # Path to ImageMagick's convert binary. + # On Windows use the full path since convert + # is also the name of a system tool.