How to export VisPy result as png image - python

Is it possible to save images made with VisPy? Maybe using vispy.io.imsave or vispy.write_png?
Also, it is possible to plot matplotlib figures in vispy using vispy.mpl_plot but is it possible to use a vispy image in matplotlib?
In any case, I would need to generate an image object with VisPy but I did not find any example of that.

Here is a minimal example. Use canvas.render to create an image, then export it with io.write_png:
import vispy.plot as vp
import vispy.io as io
# Create a canvas showing plot data
canvas = vp.plot([1, 6, 2, 4, 3, 8, 5, 7, 6, 3])
# Use render to generate an image object
img=canvas.render()
# Use write_png to export your wonderful plot as png !
io.write_png("wonderful.png",img)

Here is an updated version jvtrudel's of answer (working with vispy 0.5.0-dev):
The official demo https://github.com/vispy/vispy/blob/master/examples/basics/plotting/export.py does something very similar, and a stripped down version adjusted to export a png could look like this:
import vispy.plot as vp
import vispy.io as io
fig = vp.Fig(show=False)
fig[0, 0].plot([1, 6, 2, 4, 3, 8, 5, 7, 6, 3])
image = fig.render()
io.write_png("wonderful.png",image)

Related

Can matplotlib plot cause sklearn's PCA.fit_transform function to fail?

In code snippet one, if I run it in my Pycharm console as a complete block of code a single time, it will run completely and successfully print the PCA output twice.
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
x = [1, 2 , 3, 4, 5, 6, 7, 8, 9]
y = [3, 4, 5, 6, 7, 8, 9, 10, 11]
xy = np.array([x, y]).T
xy_pca = PCA(n_components=1).fit_transform(xy)
print(xy_pca)
ax = plt.figure().add_subplot(111)
xy_pca_2 = PCA(n_components=1).fit_transform(xy)
print(xy_pca_2)
However, if I run that complete block of code again, I get "nan's" as the output of the first print statement, but a correct output from the second print statement.
Also if I start over and use the python console to run that block of code line by line, I get a correct output on the first print statement, but "nan's" from the second print statement.
This leads me to believe that matplotlib functionality somehow interferes with a state necessary to successfully run sklearn's PCA.fit_transform function. Or something weird is happening in the console state.
But this is not the end of the story. With this second block of code below, whether it is run as a complete block or line by line from the Python console, it will never fail. The only difference is that the x and y arrays are one item shorter each. This should not affect either the matplotlib or sklearn functionality, but somehow it is making a difference.
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
x = [1, 2 , 3, 4, 5, 6, 7, 8]
y = [3, 4, 5, 6, 7, 8, 9, 10]
xy = np.array([x, y]).T
xy_pca = PCA(n_components=1).fit_transform(xy)
print(xy_pca)
ax = plt.figure().add_subplot(111)
plt.show()
xy_pca_2 = PCA(n_components=1).fit_transform(xy)
print(xy_pca_2)
System config:
Python 3.7.8
PyCharm 2020.2 (Community Edition)
Build #PC-202.6397.98, built on July 28, 2020
Runtime version 11.0.7+10-b944.20 amd64
VM OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC ParNew, ConcurrentMarkSweep
Memory 2014M
Cores 4
matplotlib 3.3.1
sklearn 0.23.2

Error exporting animation to gif - Matplotlib

I am aiming to export an animation as a gif format. I can achieve this using an mp4 but am getting an error when converting to gif. I'm not sure if its the script that wrong or some backend settings.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation
df1 = pd.DataFrame({
'Time' : [1,1,1,2,2,2,3,3,3],
'GroupA_X' : [3, 4, 5, 12, 15, 16, 21, 36, 47],
'GroupA_Y' : [2, 4, 5, 12, 15, 15, 22, 36, 45],
'GroupB_X' : [2, 5, 3, 12, 14, 12, 22, 33, 41],
'GroupB_Y' : [2, 4, 3, 13, 13, 14, 24, 32, 45],
})
fig, ax = plt.subplots()
ax.grid(False)
ax.set_xlim(0,50)
ax.set_ylim(0,50)
def groups():
Group_A = df1[['Time','GroupA_X','GroupA_Y']]
GA_X = np.array(Group_A.groupby(['Time'])['GroupA_X'].apply(list))
GA_Y = np.array(Group_A.groupby(['Time'])['GroupA_Y'].apply(list))
GA = ax.scatter(GA_X[0], GA_Y[0], c = ['blue'], marker = 'o', s = 10, edgecolor = 'black')
return GA, GA_X, GA_Y
def animate(i) :
GA, GA_X, GA_Y = groups()
GA.set_offsets(np.c_[GA_X[0+i], GA_Y[0+i]])
ani = animation.FuncAnimation(fig, animate, np.arange(0,3), interval = 1000, blit = False)
# If exporting as an mp4 it works fine.
#Writer = animation.writers['ffmpeg']
#writer = Writer(fps = 10, bitrate = 8000)
#ani.save('ani_test.mp4', writer = writer)
#But if I try to export as a gif it returns an error:
ani.save('gif_test.gif', writer = 'imagemagick')
Error:
MovieWriter imagemagick unavailable. Trying to use pillow instead.
self._frames[0].save(
IndexError: list index out of range
Note: I have also tried the following which returns the same Index error
my_writer=animation.PillowWriter(fps = 10)
ani.save(filename='gif_test.gif', writer=my_writer)
I have tried adjusting numerous settings from other questions animate gif. My current animation settings are as follows. I am using a Mac.
###ANIMATION settings
#animation.html : none ## How to display the animation as HTML in
## the IPython notebook. 'html5' uses
## HTML5 video tag; 'jshtml' creates a
## Javascript animation
#animation.writer : imagemagick ## MovieWriter 'backend' to use
#animation.codec : mpeg4 ## 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: C:\Program Files\ImageMagick-6.9.1-Q16\ffmpeg.exe ## 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.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI ## Path to ImageMagick's convert binary.
## On Windows use the full path since convert
## is also the name of a system tool.
#animation.convert_args: ## Additional arguments to pass to convert
#animation.embed_limit : 20.0
The paths you have configured,
animation.ffmpeg_path: C:\Program Files\ImageMagick-6.9.1-Q16\ffmpeg.exe
and
animation.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI
Are for Windows, but since you are on Mac you need paths for MacOS. You should be able to get them using which from the terminal. On my Ubuntu install which gives the following
>$ which convert
/usr/bin/convert
>$ which ffmpeg
/usr/bin/ffmpeg
It should be similar for MacOS. Those are the paths which need to be supplied to the rcParams animation.convert_path and animation.ffmpeg_path, i.e.
animation.ffmpeg_path: /usr/bin/ffmpeg
animation.convert_path: /usr/bin/convert
Do note that while having the wrong paths in the matplotlib configuration would produce the error in question, fixing it may not resolve the error - there might be something else wrong as well.
I found the solution from a post to of a similar question. It seems the PillowWriter class is what worked on my computer, I couldn't get over the error arising from the ImageMagick class. You may have a better idea on what to set the bitrate and codec to, these were guesses or copied from the question I mentioned before.
ani = animation.FuncAnimation(fig, new_animate, frames=np.arange(0, 3)
plt.show()
my_writer=animation.PillowWriter(fps=20, codec='libx264', bitrate=2)
ani.save(filename='gif_test.gif', writer=my_writer)

Python version of h=area() in Matlab

I asked a related question yesterday and fortunately got my answer from jlarsch quickly. But now I am stuck with the next part, which starts with the h=area() line. I'd like to know the python version of the area() function, via which I will be able to set the colors. Could someone shed me some light again? Thanks much in advance.
...
Subplot (2,1,1);
H = plot (rand(100,5));
C = get (H, 'Color')
H = area (myX, myY);
H(1).FaceColor = C(1);
H(2).FaceColor = C(2);
Grid on;
...
The pretty much exact equivalent of MATLAB's Area plot is matplotlib's stackplot. Here is the first MATLAB example from the above link reproduced using matplotlib:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4)
y = [[1, 3, 1, 2],
[5, 2, 5, 6],
[3, 7, 3, 1]]
plt.stackplot(x, y)
plt.show()
And here is the result:
You might be looking for pygame.draw.polygon(), which can fill a polygon defined by an arbitrary array of points.
You probably want plt.fill().
A huge amount of graph types at Matplotlib Gallery

How to generate image by using python and given data?

I have one data file which is like this:
1, 23%
2, 33%
3, 12%
I want to use python to generate one histogram to represent the percentage. I followed these command:
from PIL import Image
img = Image.new('RGB', (width, height))
img.putdata(my_data)
img.show()
However I got the error when I put the data: SystemError: new style getargs format but argument is not a tuple. Do I have to change my data file? and How?
A histogram is usually made in matplotlib by having a set of data points and then assigning them into bins. An example would be this:
import matplotlib.pyplot as plt
data = [1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7]
plt.hist(data, 7)
plt.show()
You already know what percentage of your data fits into each category (although, I might point out your percentages don't add to 100...). A way to represent this is to to make a list where each data value is represented a number of times equal to its percentage like below.
data = [1]*23 + [2]*33 + [3]*12
plt.hist(data, 3)
plt.show()
The second argument to hist() is the number of bins displayed, so this is likely the number you want to make it look pretty.
Documentation for hist() is found here:
http://matplotlib.org/api/pyplot_api.html
Are you graphing only? PIL is an image processing module - if you want histograms and other graphs you should consider matplotlib.
I found an example of a histogram here.

Is there a solid method for wavelet analysis in Python?

all. So, I have some time series data that I'd like to process with a wavelet transform to represent thusly. I am relatively new to the concept of wavelets. I noticed scipy.signal has a few objects, but it seems thin. Is there a library or something out there that will aid in this? Any documentation or tutorials you know of will be greatly appreciated.
Have you tried PyWavelets?
import pywt
x = [3, 7, 1, 1, -2, 5, 4, 6]
# Discrete Wavelet Transform
cA, cD = pywt.dwt(x, 'db2')
x2 = pywt.idwt(cA, cD, 'db2')
There are a few examples in their documentation.
The GitHub repository has more updated information to check out as well.

Categories

Resources