The time extensions seems to update the tick counter in the interface view, but not for the plots? I am using the MousetrapDiscreteEvents.nlogo file in the Examples folder of the the time extension.
Plotting graphs via right clicking the plot and adding the following line doesn't work:
plot count patches with [pcolor = yellow]
However, if written in code it does work, like the authoer of the time extensions demonstrates:
set-current-plot "Untriggered traps"
plotxy ticks count patches with [pcolor = yellow]
But why doesn't the first one work?
Perhaps the extension is doing the equivalent of tick-advance (dictionary entry), which does not trigger plot updates? If so, you might report it as a bug to the extension author.
But anyway, you can work around it by calling update-plots (dictionary entry) yourself at the appropriate points in your code.
Related
I am considering drawing a network.
For example, as shown in the demo, we can use the dashboard to get the chart, but there is no "save button" on the right side, as is often the case.
cux_df = cuxfilter.DataFrame.load_graph((nodes, edges))
chart0 = cuxfilter.charts.dashader.graph(node_pixel_shade_type='linear', unselected_alpha=0.2)
d = cux_df.dashboard([chart0], layout=cuxfilter.layouts.double_feature)
chart0.view()
Since we are using large data, we would like to take advantage of cuxfilter's quick drawings. If holoviews, for example, it takes too long to compute. Screen captures, etc. are possible, but is there any way to save the resulting figure?
Drawing with datashader took too long. I could create a view screen with cuxfilter.
The only way right now is to use the dashboard preview() function, which screen captures the dashboard in it's initial state and saves it as a png file. The way to do that is as follows:
cux_df = cuxfilter.DataFrame.load_graph((nodes, edges))
chart0 = cuxfilter.charts.dashader.graph(node_pixel_shade_type='linear', unselected_alpha=0.2)
d = cux_df.dashboard([chart0], layout=cuxfilter.layouts.double_feature)
await d.preview()
This would only work in a jupyter lab/notebook environment though, and is restrictive in capturing current state.
Based on your suggestion, it was as easy as adding an extra tool to the chart using bokeh, so we ended up adding it as a new feature, for all the bokeh and datashader based charts, the progress can be tracked here. To try it out once the changes are merged, you would have to install the cuxfilter nightly version (23.02). Once the changes are merged, this is how the toolbar would look:
I have 2 questions need your help.
I would like to add a button on each plot to be a setting button. I use label with event listener and it works well ( as shown in attached file). However, my client asked me to change from normal text to graphic icon? How should I proceed?
As you can see from the attached image, the third plot is macd series. The value rage is from -3e-8 to 3e-8 (by my observation). I manually set the maximum and minimum, and it get incorrect scale as shown.
How should I set the maximum and minimum for yScale?
I don't know how to get maximum and minimum value from a series. Can you suggest me?
A1 – Unfortunately, the current version of AnyChart doesn't provide an opportunity to add custom-made buttons inside the chart. But you can use a trick and use stage based layout. It means that the container includes a stage. The stage includes the stock chart all other elements by layers. Using this approach you can place an image (icon) upon the plot and set a listener just as for the 'settings' label.
For details, please, check the sample in the comment below.
A2 - We are planning to fix this behavior in 8.4.2 update (approximately by the end of November 2018).
I will notify you when the fix becomes available.
As a temporary workaround, you can get min /max value from your MACD indicator. For details, please, check the sample in the comment below.
You can apply min/max to the yScale of plot #0 like this:
chart.plot(0).yScale().minimum(minValue);
chart.plot(0).yScale().maximum(maxValue);
We are glad to inform you that we have released 8.4.2 update which brings many fixes and improvements. This update also includes a fix on the issue you reported. Now calculation of min/max of Y-scale works properly with small values. Update your binaries to get the fix.
This answer provides a nice way to make smooth animations in SciLab. I now have to write a simulation of a body attached to two strings (and therefore its movement regarding some additional forces).
The code in the link works well to render movement of a single point and, unfortunately, I didn't manage to make an animation of a point + two lines using this method. If someone is curious, I tried this code to do it:
frametime=(tk-t0)/Nt//defining the waitnig time
plot(Y(1,1),Y(2,1),"o")//plotting the point
plot([0;Y(1,1)],[0;Y(2,1)],style=1)
plot([D;Y(1,1)],[0;Y(2,1)],style=1)//plotting the two initial lines
h1_compound = gce();
h_point=h1_compound.children
h_point.mark_size = 20;
h_point.mark_background = 2;
h_line1=h_compound.children
h_line2=h_compound.children
//h_axes = gca();
//h_axes.data_bounds = [0,-1;10,1];
realtimeinit(frametime);
for i=1:Nt//my vectors have Nt points
realtime(i);//wait "frametime" seconds before drawing the new position
h_point.data=[Y(1,i),Y(2,i)];
h_line1.data=[[0;Y(1,i)],[0;Y(2,i)]]
h_line2.data=[[D;Y(1,i)],[0;Y(2,i)]]
end
The question is: is there any way to make an animation of three shapes without making axes blink (as it is with the window refreshment) or other wierd stuff?
Since you didn't create a MCVE I can't reproduce your exact problem. But you may try to add drawlater(); before, and drawnow(); after your data modification to see if it does help with blinking or not.
Or you may get much better looking result by saving your plots in every round with xs2gif and assemble the animation with another gifmaker progam (there are free online sites to do this, however with some limitations). If you need to present your result, you should do this step anyway.
I am trying to plot a time series (a seismograph) with a corresponding spectrogram in R.
Since I would like to compare the time series with the spectrogram, the X axis labels on the time series need to line up with the X axis labels on the spectrogram. However, I'm having a lot of trouble with this. The best I've been able to do so far is use
par(mar=c(0,10,0,8))
and try to manually force the spectrogram labels to line up with the time series labels by tweaking the spectrogram margin. Of course this is only approximate and they still do not line up perfectly. Is there a way to make the axes generated by the code below match up with each other?
par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l",xlab="Time",
ylab="Amplitude", main="Time Series", xlim=c(1,10))
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
xlab="Time", ylab="Frequency", main="Spectrogram", xlim=c(1,10))
Thanks in advance!
This seems to work:
par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l", xaxs="i")
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
xlab="Time", ylab="Frequency", main="Spectrogram")
Just drop the xlim= arguments and use xaxs="i" in the plot() function to match the default for image().
You can either add xaxs='i' to the call to plot (this removes the extra padding so it lines up with the image plot), or you could use par('usr') after the 1st plot to see what the x limits are and use those values in the xlim call in image.
It turns out that this is way easier than it looked initially. The secret is to make a "dummy plot" and then add the image to the plot. So here's how the new, working code looks:
par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01),
type="l",xlab="Time",ylab="Amplitude", main="Time Series")
plot(c(0,10), c(0,10), type="n") #Dummy plot with axis limits for our spectrogram
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
xlab="Time", ylab="Frequency", main="Spectrogram",add=TRUE)
Similar, but conversely, to Greg Snow's answer, you could add xaxs='r' to the call to image as follows:
par(mar=c(0,10,0,8))
par(mfcol=c(2,1))
plot(seq_len(1000)*0.01, sin(2*pi*seq_len(1000)*0.01), type="l",xlab="Time",
ylab="Amplitude", main="Time Series", xlim=c(1,10))
image(seq_len(1000)*0.01,seq_len(100)*0.1,array(runif(1000000),dim=c(1000,100)),
xlab="Time", ylab="Frequency", main="Spectrogram", xlim=c(1,10), xaxs="r")
Don't forget to save your par() setting first.
(maybe I should have put that above)
I need to plot and display several jpeg images in a single combined display (or canvas?). For example, suppose I have images {a,b,c,d}.jpg, each of different size, and I would like to plot them on one page in a 2x2 grid. It would be also nice to be able to set a title for each subplot.
I've been thoroughly looking for a solution, but couldn't find out how to do it, so any ideas would really help. I would preferably use a solution that is based on the EBImage package.
There are two ways how to arrange several plots with base graph functions, namely par(mfrow=c(rows,columns)) (substitute rows and columns with integers) and layout(mat) where mat is a matrix like matrix(c(1,2,3,4)).
For further info see ?par, ?layout, and especially Quick-R: Combining Plots.
However, as your question is about images I don't know if it helps you at all. If not, I am sorry for misinterpreting your question.
To add to Henriks solution, a rather convenient way of using the par() function is:
jpeg(filename="somefile.jpg")
op <- par(mfrow=c(2,2)
#plot the plots you want
par(op)
dev.off()
This way, you put the parameters back to the old state after you ran the code. Be aware of the fact this is NOT true if one of the plots gave an error.
Be aware of the fact that R always put the plots in the same order. Using mfrow fills the grid row by row. If you use mfcol instead of mfrow in the code, you fill up column by column.
Layout is a whole different story. Here you can define in which order the plots have to be placed. So layout(matrix(1:4,nrow=2) does the same as par(mfcol=c(2,2)). But layout(matrix(c(1,4,3,2),ncol=2)) places the first plot lefttop, the next one rightbottom, the third one righttop, and the last one leftbottom.
Every plot is completely independent, so the titles you specify using the option main are printed as well. If you want to have more flexibility, you should take a look at lattice plots.
If you do not want the images in a regular grid (the different sizes could imply this), then you might consider using the subplot function from the TeachingDemos package. The last example in the help page shows using an image as a plotting character, just modify to use your different images and sizes/locations.
The ms.image function (same package) used with my.symbols is another possibility.