Manually enable export as EMF

Hey there,

In my application I'd like to export plots as Enhanced Metafiles (.emf).
After finding out that saving created plots as EMF generates an error, I
http://www.nabble.com/EMF-export-doesn't-work-td22618867.html read that
emf is no longer supported . Then I tried to
http://www.nabble.com/How-to-add-a-new-backend--td20089848.html#a20091178
manually enable exporting as EMF , but matplit.use('emf') generates a
NotImplementedError.

So, I'd like to know if someone happens to know of a simple method to
reimplement the support for EMF files.

Thanks in advance for your time and effort!

Cheers,

Gert-Jan

···

--
View this message in context: http://www.nabble.com/Manually-enable-export-as-EMF-tp23293186p23293186.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

The syntax is

matplotlib.use(‘module://backend_emf’)

if backend_emf.py is in your PYTHONPATH. There is no guarantee that this module will work with your version of matplotlib, so you may need to do some work porting it to the latest backend API.

JDH

backend_emf.py (21.9 KB)

···

On Wed, Apr 29, 2009 at 3:51 AM, Gert-Jan <gj_den_heijer@…32…> wrote:

Hey there,

In my application I’d like to export plots as Enhanced Metafiles (.emf).

After finding out that saving created plots as EMF generates an error, I

http://www.nabble.com/EMF-export-doesn%27t-work-td22618867.html read that

emf is no longer supported . Then I tried to

http://www.nabble.com/How-to-add-a-new-backend–td20089848.html#a20091178

manually enable exporting as EMF , but matplit.use(‘emf’) generates a

NotImplementedError.

So, I’d like to know if someone happens to know of a simple method to

reimplement the support for EMF files.

Thanks in advance for your time and effort!

Hello again,

Thanks for the reply! I did some more testing, but I couldn't get it to work
yet. However, during the testing, I got the idea that I was wrong about what
backends do; it appears they are only used for creating plots, not for
saving them. For example:

#!/usr/bin/env python

import matplotlib
matplotlib.use('module://backend_emf')
from pylab import *

x = [0,1,2,3]
y = [4,3,2,1]

figure()
plot(x,y)
savefig('C:\\test.emf')

This still results in a NotImplemented error. Trying to save as another file
type (savefig(C':\\test.pdf') for example) won't work anymore, either.
Trying to save as PDF, for example, gives this error message:

ValueError: Format "pdf" is not supported.
Supported formats: emf.

Basically, what I'd like to have is that, when the user views the plot and
presses the save button, the user can select 'Enhanced Metafile (*.emf)'
from the file type list and save as EMF.

Well, thanks for the help so far. I hope there is a solution for this.
Otherwise I think I'll revert to an older version.

PS. It appears as though the Matplotlib creators have forgotten to remove
EMF from the file type list, as it's still there.
Also, there appears to be a bug when saving files, as the selection from the
file type list is ignored and the file is saved as PNG instead, unless you
manually add another extension in the name.

···

--
View this message in context: http://www.nabble.com/Manually-enable-export-as-EMF-tp23293186p23330477.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

Gert-Jan wrote:

Hello again,

Thanks for the reply! I did some more testing, but I couldn't get it to work
yet. However, during the testing, I got the idea that I was wrong about what
backends do; it appears they are only used for creating plots, not for
saving them. For example:

#!/usr/bin/env python

import matplotlib
matplotlib.use('module://backend_emf')
from pylab import *

x = [0,1,2,3]
y = [4,3,2,1]

figure()
plot(x,y)
savefig('C:\\test.emf')

This still results in a NotImplemented error. Trying to save as another file
type (savefig(C':\\test.pdf') for example) won't work anymore, either.
Trying to save as PDF, for example, gives this error message:

ValueError: Format "pdf" is not supported.
Supported formats: emf.

Basically, what I'd like to have is that, when the user views the plot and
presses the save button, the user can select 'Enhanced Metafile (*.emf)'
from the file type list and save as EMF.
  

Can you be more specific about why that doesn't work?

Well, thanks for the help so far. I hope there is a solution for this.
Otherwise I think I'll revert to an older version.

PS. It appears as though the Matplotlib creators have forgotten to remove
EMF from the file type list, as it's still there.
  

Yes -- that was an oversight.

Also, there appears to be a bug when saving files, as the selection from the
file type list is ignored and the file is saved as PNG instead, unless you
manually add another extension in the name.
  

What GUI backend are you using? That sounds like a bug in how the file selection dialog is being used.

Cheers,
Mike

···

--
Michael Droettboom
Science Software Branch
Operations and Engineering Division
Space Telescope Science Institute
Operated by AURA for NASA

Michael Droettboom-3 wrote:

Can you be more specific about why that doesn't work?

Trying to save a plot as, for example, 'image.emf' makes an error message
pop up. This error dialog has the title 'Error saving file', but does not
have any error message in its body.
I hope that is what you mean?

Michael Droettboom-3 wrote:

What GUI backend are you using? That sounds like a bug in how the file
selection dialog is being used.

I'm using the Qt4 backend in my application, though the code examples I gave
are created and executed without any GUI backend.

To see this for yourself you could run this example code:

from pylab import *

x = [0,1,2,3]
y = [4,3,2,1]

figure()
plot(x,y)
show()

I'm using the most current version (0.98.5.2) of Matplotlib, just to be
clear about that.

Cheers,

Gert-Jan

···

--
View this message in context: http://www.nabble.com/Manually-enable-export-as-EMF-tp23293186p23333043.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

Hi,
I'm new with matplotlib.

I need to make a graph with the X axis represents time in hours and
minutes. My script don't works, I want to display all the values of time
that I have.
I use a list of string like this :
t=['0015', '0030', '0045', '0100', '0115', '0130', '0145', '0200',
'0215', '0230', '0245', '0300', '03
15', '0330', '0345', '0400', '0415', '0430', '0445', '0500', '0515',
'0530', '0545', '0600', '0615',
'0630', '0645', '0700', '0715', '0730', '0745', '0800', '0815', '0830',
'0845', '0900', '0915', '09
30', '0945', '1000', '1015', '1030', '1045', '1100', '1115', '1130',
'1145', '1200', '1215', '1230',
'1245', '1300', '1315', '1330', '1345', '1400', '1415']

ax.plot(t, y)

I tried to convert hours and minutes to the base 100 ( , it works but I
can not show on the x-axis the hours, minutes.
I tried to use plot_date, but I don't understand "x and/or y can be a
sequence of dates represented as float days since 0001-01-01 UTC."

Could you help me, please ?

/olivier

Hey all,

I was just hoping anyone could help me further here... it would be highly
appreciated.

Thanks in advance,

Gert-Jan

Olivier Benoist wrote:

Hi,
I'm new with matplotlib.

I need to make a graph with the X axis represents time in hours and
minutes. My script don't works, I want to display all the values of time
that I have.
I use a list of string like this :
t=['0015', '0030', '0045', '0100', '0115', '0130', '0145', '0200',
'0215', '0230', '0245', '0300', '03
15', '0330', '0345', '0400', '0415', '0430', '0445', '0500', '0515',
'0530', '0545', '0600', '0615',
'0630', '0645', '0700', '0715', '0730', '0745', '0800', '0815', '0830',
'0845', '0900', '0915', '09
30', '0945', '1000', '1015', '1030', '1045', '1100', '1115', '1130',
'1145', '1200', '1215', '1230',
'1245', '1300', '1315', '1330', '1345', '1400', '1415']

ax.plot(t, y)

I tried to convert hours and minutes to the base 100 ( , it works but I
can not show on the x-axis the hours, minutes.
I tried to use plot_date, but I don't understand "x and/or y can be a
sequence of dates represented as float days since 0001-01-01 UTC."

Could you help me, please ?

/olivier

------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations
Conference from O'Reilly Media. Velocity features a full day of
expert-led, hands-on workshops and two days of sessions from industry
leaders in dedicated Performance & Operations tracks. Use code vel09scf
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I believe this needs its own thread. =)

···

--
View this message in context: http://www.nabble.com/Manually-enable-export-as-EMF-tp23293186p23422798.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

You don’t necessarily need to use plot_date. Try this:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, MultipleLocator

times = [‘0015’, ‘0030’, ‘0045’, ‘0100’, ‘0115’, ‘0130’, ‘0145’, ‘0200’, ‘0215’,
‘0230’, ‘0245’, ‘0300’, ‘0315’, ‘0330’, ‘0345’, ‘0400’, ‘0415’, ‘0430’,

'0445', '0500', '0515', '0530', '0545', '0600', '0615', '0630', '0645',
'0700', '0715', '0730', '0745', '0800', '0815', '0830', '0845', '0900',

'0915', '0930', '0945', '1000', '1015', '1030', '1045', '1100', '1115',
'1130', '1145', '1200', '1215', '1230', '1245', '1300', '1315', '1330',

'1345', '1400', '1415']

Conver the string time values into the corresponding number of minutes

minutes = np.array([int(t[:2])*60 + int(t[2:]) for t in times])

y = np.random.rand(*minutes.shape)

plt.plot(minutes, y)
ax = plt.gca()

Set the formatter to take a value in minutes and convert to hour:minute

ax.xaxis.set_major_formatter(FuncFormatter(
lambda t,p : ‘%02d:%02d’ % (t//60, t%60)))

Set up placing tick marks every 15 minutes

ax.xaxis.set_major_locator(MultipleLocator(15))

Used to rotate all of the ticks so that they fit on the plot.

ha=‘center’ aligns them better to the tick marks

fig = plt.gcf()
fig.autofmt_xdate(rotation=90, ha=‘center’)
plt.show()

Ryan

···

On Mon, May 4, 2009 at 9:49 AM, Olivier Benoist <olivier.benoist@…2590…> wrote:

Hi,

I’m new with matplotlib.

I need to make a graph with the X axis represents time in hours and

minutes. My script don’t works, I want to display all the values of time

that I have.

I use a list of string like this :

t=[‘0015’, ‘0030’, ‘0045’, ‘0100’, ‘0115’, ‘0130’, ‘0145’, ‘0200’,

‘0215’, ‘0230’, ‘0245’, ‘0300’, '03

15’, ‘0330’, ‘0345’, ‘0400’, ‘0415’, ‘0430’, ‘0445’, ‘0500’, ‘0515’,

‘0530’, ‘0545’, ‘0600’, ‘0615’,

‘0630’, ‘0645’, ‘0700’, ‘0715’, ‘0730’, ‘0745’, ‘0800’, ‘0815’, ‘0830’,

‘0845’, ‘0900’, ‘0915’, '09

30’, ‘0945’, ‘1000’, ‘1015’, ‘1030’, ‘1045’, ‘1100’, ‘1115’, ‘1130’,

‘1145’, ‘1200’, ‘1215’, ‘1230’,

‘1245’, ‘1300’, ‘1315’, ‘1330’, ‘1345’, ‘1400’, ‘1415’]

ax.plot(t, y)

I tried to convert hours and minutes to the base 100 ( , it works but I

can not show on the x-axis the hours, minutes.

I tried to use plot_date, but I don’t understand "x and/or y can be a

sequence of dates represented as float days since 0001-01-01 UTC."

Could you help me, please ?


Ryan May
Graduate Research Assistant

School of Meteorology
University of Oklahoma
Sent from Norman, Oklahoma, United States