Skip to main content

plotting - Plot of continuous function cuts off


Why the following plot cuts off at integer points ?


Plot[Cos[Pi IntegerPart[x]]
Min[Abs[FractionalPart[x]], Abs[FractionalPart[x] - 1]], {x, 0, 10}]

enter image description here


Update


It gets connected when you add Exclusions -> None as an option, but It is not clear why this function has exclusive points, since it is continuous. Also it gets connected if you increase the PlotPoints (thanks to the comments). Also why at x=9 the cut is more severe than say at x=1 or x=2 ?



Can someone explain what is the issue here, and how these two options solve(or maybe hide) the issue ?



Answer



This behavior has been evolving ever since Mathematica was created. Something different happens in V11 than in V10. (I'm unable to go back further.) I'll describe V10 first, since its behavior conforms to the OP.


IN V10, the gaps are because the functions FractionalPart and IntegerPart are discontinuous, which makes the gaps symmetric. In plotting, Mathematica does not check limits at their discontinuities to see if the expression being plotted happens to be continuous. Rather, it assumes the discontinuities in the component functions propagate to discontinuities in the plot and puts a little gap in the plot at each one.


I assume this choice (not to check limits) was made for the sake of speed. The discontinuities are identified by a time-constrained symbolic analysis of the function.


The size of the gap is determined by the sampling. With higher setting for PlotPoints, the smaller the gap. The sampling can be observed using Mesh -> All. The sampling is a result of an asymmetric recursive subdivision of "active" subintervals, which depends principally on the angles between successive line segments used to approximate the graph. As a result, the gaps are not identical.


Plot[Cos[Pi IntegerPart[x]] Min[Abs[FractionalPart[x]], 
Abs[FractionalPart[x] - 1]], {x, 0, 10}, Mesh -> All,
MeshStyle -> Red]


Mathematica graphics


The gaps are not visible at ordinary size with lots of plot points:


Plot[Cos[Pi IntegerPart[x]] Min[Abs[FractionalPart[x]], 
Abs[FractionalPart[x] - 1]], {x, 0, 10}, PlotPoints -> 1000]

Mathematica graphics


Another approach, mentioned by @kglr in a comment, is to turn off the processing with Exclusions -> None.


Plot[Cos[Pi IntegerPart[x]] Min[Abs[FractionalPart[x]], 
Abs[FractionalPart[x] - 1]], {x, 0, 10}, Exclusions -> None]


IN V11, Plot adds sampling points close to the discontinuity. It still does not connect the lines, but if the function is continuous, the gap should be imperceptible.


plot = Plot[
Cos[Pi IntegerPart[x]] Min[Abs[FractionalPart[x]], Abs[FractionalPart[x] - 1]],
{x, 0, 10}, Mesh -> All, MeshStyle -> Red]
Count[plot, _Line, Infinity]

Mathematica graphics


(*  20  <-- number of continuous lines *)

One continuous line is created with Exclusions -> None:



Count[
Plot[Cos[Pi IntegerPart[x]] Min[Abs[FractionalPart[x]],
Abs[FractionalPart[x] - 1]], {x, 0, 10}, Exclusions -> None],
_Line, Infinity]
(* 1 <-- number of continuous lines *)

Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....