Hello everyone!
I'm creating a customizing tools in arcgis. I want to show some diagrams in arcgis, which made by matplotlib.
Everything works fine, the diagram kann even be saved in the right way, except when I show the plot through plt.show()
, ArcGIS hangs and I have to force it to close with Task Manager.
Changing plt.show()
to plt.show(block=False)
should make the plot non-blocking, but this crashes ArcMap either, with a Runtime Error.
I am working with Windows 7 and ArcGIS 10.1.
The codes are something like:
import ConversionUtils
import arcpy
from arcpy import env
import matplotlib.pyplot as plt
xLabelName = ConversionUtils.gp.GetParameterAsText(0)
yLabelName = ConversionUtils.gp.GetParameterAsText(1)
Titel = ConversionUtils.gp.GetParameterAsText(2)
fig = plt.figure()
plt.plot(range(10), range(10))
plt.xlabel(xLabelName, fontsize = 14)
plt.ylabel(yLabelName, fontsize = 14)
plt.title(str(Titel), fontsize = 16)
plt.grid()
plt.savefig('abc.png')
plt.show()
Because matplotlib uses TKinter by default, so the window pop up from plt.show()
crashes ArcGIS.
The problem has been bothering me for days. I will greatly appreciate any ideas on how can I solve this Problem.
Thank you.
Solved! Go to Solution.
As an alternative, why not just let the default image viewer open the plot?
import os import matplotlib.pyplot as plt def plotthegraph(): xLabelName = "x label" yLabelName = "y_label" title = "Title" fig = plt.figure() plt.plot(range(10), range(10)) plt.xlabel(xLabelName, fontsize = 14) plt.ylabel(yLabelName, fontsize = 14) plt.title(str(title), fontsize = 16) plt.grid() plt.savefig(r'H:\abc.png') plt.close() os.system(r'H:\abc.png') #this should allow the installed image viewer to open the png
It will probably remain so, since no one can replicate the problem with only partial code.
I have complemented the code.
So the trick is to track down the source of the error. I edited the code to simplify it.
import ConversionUtils import arcpy from arcpy import env import matplotlib.pyplot as plt xLabelName = "x label" yLabelName = "y_label" title = "Title" fig = plt.figure() plt.plot(range(10), range(10)) plt.xlabel(xLabelName, fontsize = 14) plt.ylabel(yLabelName, fontsize = 14) plt.title(str(title), fontsize = 16) plt.grid() plt.savefig("f:/test/abc.png") plt.show()
Basically I got rid of all that conversion stuff and tried to get output as a graph (see image) and as a file (see file).
It works...ergo...your problem is with your inputs using that ConversionUtils stuff. At least your have a start point.
Yes, as you've tried, it works also fine only with python IDLE.
Because I use the code as the source of a customizing tool, so I need using that ConversionUtils). The problem is : the matplotlib utilizes Tkinter in it's backend. I've had problems running Tkinter windows from within ArcMap.
Yes, Tkinter will cause crashes, just google " tkinter arcmap crash " for some examples.
There are also posts for alternatives, for example python addins
python addin - Creating Tkinter dialog box in arcpy? - Geographic Information Systems Stack Exchange
But practically, you would be better off, using a conventional or python toolbox to get your input parameters rather than reinventing the wheel in a different dialog, if you intend to use this in arcmap
My input parameters are using a conventional GUI through ConversionUtils.gp.GetParameterAsText.
The Tkinter window is a output window, which pop up through plt.show().
After I run the tool/script, it shows an extra window with the plot diagram. Just like the output in IDLE.
Then I want to use this output window. After I usethe Pan/Zoom
button, then click the save button in this window, it crashes arcgis. The diagram cannot be saved with this button, but I want to...
Sorry...the window I showed works for me, don't know why yours doesn't. Using Windows 10, ArcMap 10.3.1, tested in python 3.4.x and 2.7.x
It doesn't work by me..I have to force it to close arcgis with Task Manager.
but thank you all the way.
you might want to try it without the ConversionUtils module and either develop your app so that arcmap doesn't need to be open