Re: [Matplotlib-users] Type 1 fonts with log graphs
Hi Brandon, I notice that this is cross-posted on StackOverflow ( http://stackoverflow.com/questions/13132194/type-1-fonts-with-log-graphs). Personally, I have no problem with cross posting, but to save two people having to answer the same question, I would make sure it was explicit that this had also been posted elsewhere. Thanks, Phil On 30 October 2012 03:13, Brandon Heller brand...@stanford.edu wrote: Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks, Brandon -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] Type 1 fonts with log graphs
There are a couple of alternative formatters for log scaling that don't require mathtext. You can do: from matplotlib.tickers import LogFormatter, LogFormatterExponent ... ax.xaxis.set_major_formatter(LogFormatter()) # or LogFormatterExponent(), which is just the exponent To clarify the font issue. The PDF backend has no support for outputting Type 1 fonts. There is an rcParam pdf.fonttype that allows you to choose between Type 3 and Type 42 fonts, however. Type 3 stores each character as a path and then uses those to put strings together. It supports font subsetting, so an entire large font is not embedded in the file. Type 42 (essentially) just embeds a TrueType font in the file, and we don't support subsetting there. There is also the pdf.use14corefonts that will use the 14 built-in PDF fonts whenever possible (and therefore not embed any fonts). However, mathtext requires a special font for the math symbols, and thus it starts to embed fonts. You may try setting mathtext.default to regular, which will use the font used as the default for the rest of the text first. This should have the effect of not embedding any extra fonts in the file as long as you don't use any special symbols in the math. Mike On 10/30/2012 05:23 AM, Phil Elson wrote: Hi Brandon, I notice that this is cross-posted on StackOverflow (http://stackoverflow.com/questions/13132194/type-1-fonts-with-log-graphs). Personally, I have no problem with cross posting, but to save two people having to answer the same question, I would make sure it was explicit that this had also been posted elsewhere. Thanks, Phil On 30 October 2012 03:13, Brandon Heller brand...@stanford.edu mailto:brand...@stanford.edu wrote: Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks, Brandon -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net mailto:Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make
Re: [Matplotlib-users] Type 1 fonts with log graphs
Hi Phil, Next time I'll be more explicit. I added the question to SA after I tried to get a public link to my message and saw that archives past July of this year seem to be missing. It wasn't clear that this list was even still alive: http://sourceforge.net/mailarchive/forum.php?forum_name=matplotlib-users Any idea why the archives seem to have stopped? Thanks, Brandon On Tue, Oct 30, 2012 at 2:23 AM, Phil Elson pelson@gmail.com wrote: Hi Brandon, I notice that this is cross-posted on StackOverflow ( http://stackoverflow.com/questions/13132194/type-1-fonts-with-log-graphs). Personally, I have no problem with cross posting, but to save two people having to answer the same question, I would make sure it was explicit that this had also been posted elsewhere. Thanks, Phil On 30 October 2012 03:13, Brandon Heller brand...@stanford.edu wrote: Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks, Brandon -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Re: [Matplotlib-users] Type 1 fonts with log graphs
On Tue, Oct 30, 2012 at 5:51 AM, Michael Droettboom md...@stsci.edu wrote: There are a couple of alternative formatters for log scaling that don't require mathtext. You can do: from matplotlib.tickers import LogFormatter, LogFormatterExponent ... ax.xaxis.set_major_formatter(LogFormatter()) # or LogFormatterExponent(), which is just the exponent To clarify the font issue. The PDF backend has no support for outputting Type 1 fonts. There is an rcParam pdf.fonttype that allows you to choose between Type 3 and Type 42 fonts, however. Type 3 stores each character as a path and then uses those to put strings together. It supports font subsetting, so an entire large font is not embedded in the file. Type 42 (essentially) just embeds a TrueType font in the file, and we don't support subsetting there. There is also the pdf.use14corefonts that will use the 14 built-in PDF fonts whenever possible (and therefore not embed any fonts). However, mathtext requires a special font for the math symbols, and thus it starts to embed fonts. You may try setting mathtext.default to regular, which will use the font used as the default for the rest of the text first. This should have the effect of not embedding any extra fonts in the file as long as you don't use any special symbols in the math. Hi Mike, Thanks for the suggestions - I tried both. The first (use a LogFormatter) yields only Type 1 but doesn't look look as good as exponential notation (my style preference). The second (mathtext.default = regular) defaulted to CMR and kept the exponents as Type 1, but not the helvetica used by the rest of the graph. It used CMR even when I had set another font as the default: rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) ... so maybe I'm not setting the default properly. Any ideas there? A suggestion from my colleague Vimal Kumar was to post-process the output to replace Type3 w/Type 1: sed -i.bak \ -e s/Type3/Type1/g \ -e s/BitstreamVeraSans-Roman/Helvetica/g \ -e s/DejaVuSans/Helvetica/g \ $file This has the advantage that no mattext or tex is required, though I have to assume the letter spacing is meant for the original font. In practice, the only replaced fonts are on the Y axis, so even if the spacing between letters seems a bit bigger, I don't think this is a huge issue. Of course, it would still be nice to solve this problem in MPL itself, though. Thanks, Brandon Mike On 10/30/2012 05:23 AM, Phil Elson wrote: Hi Brandon, I notice that this is cross-posted on StackOverflow ( http://stackoverflow.com/questions/13132194/type-1-fonts-with-log-graphs). Personally, I have no problem with cross posting, but to save two people having to answer the same question, I would make sure it was explicit that this had also been posted elsewhere. Thanks, Phil On 30 October 2012 03:13, Brandon Heller brand...@stanford.edu wrote: Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks,
Re: [Matplotlib-users] Type 1 fonts with log graphs
On 10/30/2012 12:25 PM, Brandon Heller wrote: Hi Phil, Next time I'll be more explicit. I added the question to SA after I tried to get a public link to my message and saw that archives past July of this year seem to be missing. It wasn't clear that this list was even still alive: http://sourceforge.net/mailarchive/forum.php?forum_name=matplotlib-users Any idea why the archives seem to have stopped? Thanks for pointing that out. I'm not sure what's wrong, but I'll look into it. Mike Thanks, Brandon On Tue, Oct 30, 2012 at 2:23 AM, Phil Elson pelson@gmail.com mailto:pelson@gmail.com wrote: Hi Brandon, I notice that this is cross-posted on StackOverflow (http://stackoverflow.com/questions/13132194/type-1-fonts-with-log-graphs). Personally, I have no problem with cross posting, but to save two people having to answer the same question, I would make sure it was explicit that this had also been posted elsewhere. Thanks, Phil On 30 October 2012 03:13, Brandon Heller brand...@stanford.edu mailto:brand...@stanford.edu wrote: Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks, Brandon -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net mailto:Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users
[Matplotlib-users] Type 1 fonts with log graphs
Hi, I'm trying to use Matplotlib graphs as part of a camera-ready submission, and the publishing house requires the use of Type 1 fonts only. I'm finding that the PDF backend happily outputs Type-1 fonts for simple graphs with linear Y axes, but outputs Type-3 fonts for logarithmic Y axes. Using a logarithmic yscale incurs the use of mathtext, which seems to use Type 3 fonts, presumably because of the default use of exponential notation. I can use an ugly hack to get around this - using pyplot.yticks() to force the axis ticks to not use exponents - but this would require moving the plot region to accommodate large labels (like 10 ^ 6) or writing the axes as 10, 100, 1K, etc. so they fit. There's a minimum working example below, which I've tested with the matplotlib master branch as of today, as well as 1.1.1, which produces the same behavior, so I don't know that this is a bug, probably just unexpected behavior. #!/usr/bin/env python # Simple program to test for type 1 fonts. # Generate a line graph w/linear and log Y axes. from matplotlib import rc, rcParams #rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) # These lines are needed to get type-1 results: # http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html rcParams['ps.useafm'] = True rcParams['pdf.use14corefonts'] = True rcParams['text.usetex'] = False import matplotlib.pyplot as plt YSCALES = ['linear', 'log'] def plot(filename, yscale): plt.figure(1) xvals = range(1, 2) yvals = xvals plt.plot(xvals, yvals) plt.yscale(yscale) #YTICKS = [1, 10] #plt.yticks(YTICKS, YTICKS) # locs, labels ax = plt.gca() #print ax.get_xticklabels()[0].get_text() print ,.join([a.get_label() for a in ax.get_yticklabels()]) plt.savefig(filename + '.pdf') if __name__ == '__main__': for yscale in YSCALES: plot('linegraph-' + yscale, yscale) Does anyone know a clean way to get Type 1 fonts with log axes? Thanks, Brandon -- Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct ___ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users