Skip to main content

plotting - Graphics plot of point using unfilled circle



I'd like to be able to place points on a plot using Graphics[{Point[{a,b}],....}] but have the plot symbol be an unfilled circle. I've looked around but can't find any way of doing this. Is there one? Thanks.


After reading the first response, perhaps I should add a bit more. I'd like to be able to do the following:


p1 = Plot[x^2,{x,-3,3}]
p2 = Graphics[Style[Point[{0,0}],PointSize[Large]]
Show[p1,p2]

but with an unfilled circle instead of a dot.


The solution proposed in the first answer falls short in two ways: first, the unfilled circle does not properly hide graphics elements underneath it; second, the circle will appear as an ellipse, not a circle, in the (likely) event that the underlying graphic does not have aspect ratio 1.


The application here is for plotting piecewise discontinuous functions and showing clearly which endpoint at a jump discontinuity holds the value at the point.



Answer




The purpose of the circles is to mark discontinuities, but if I understand you correctly you don't want exactly the same as in this linked question where the ExclusionsStyle option is discussed. You want the circles to sit only on one side of a discontinuity to indicate which side holds the value.


I'll compare that to the ExclusionsStyle method here. If you do use that option, it is possible to replace the default Point markers by anything you want using a replacement rule after the plot has been drawn:


With[{pointSize = .1},
Plot[
Floor[x], {x, -3, 3}, Background -> LightGray,
ExclusionsStyle -> {None, {}}] /. Point[x_] :> Map[
Inset[
Graphics[
{EdgeForm[Black], Cyan, Disk[]}
],

#, Automatic, pointSize] &,
x
]
]

ExclusionsStyle


So what I did here is to specify a dummy ExclusionsStyle with an empty list {} where the point style directive would normally go, just to make Mathematica draw Points at the discontinuities in the first place.


Then I replace every occurrence of Point by an Inset containing the desired outlined disk (I colored it cyan for clarity here). The Inset is positioned where the Point coordinates would have been. The Map is used to take into account the fact that Point has a whole list of coordinates as its argument, and a new Inset has to replace each of these.


As I said, this may not be what you need because it marks both sides of the discontinuity equally.


An alternative would be to not use ExclusionsStyle, as you already suggest in the question. But instead of using Graphics to make the points, I would suggest to use ListPlot. Not only is it specially designed to do just such point sets, but moreover it is relatively straightforward to pass it arbitrary symbols or graphics as markers for the points:



With[{markerSize = .03},
Show[
Plot[Floor[x], {x, -3, 3},
PlotStyle -> Thick],
ListPlot[
Table[{i, i}, {i, -3, 3}],
PlotMarkers -> {
Graphics[
{EdgeForm[Black],
Yellow, Disk[]}

], markerSize
}
],
Background -> LightGray
]
]

ListPlot


Here, the Table contains the points I want to mark, and that allows me to exclude one side of each discontinuity. Here I chose a yellow disk for clarity.


Edit



By using ListPlot with the points collected in a Table, one also has the flexibility to add differently styled points to mark the two sides of a discontinuity separately - something which is much harder to do within the framework of ExclusionsStyle:


With[{markerSize = .03}, Show[
Plot[Floor[x], {x, -3, 3}, PlotStyle -> Thick],
ListPlot[{
Table[{i, i}, {i, -3, 3}],
Table[{i + 1, i}, {i, -3, 3}]},
PlotMarkers -> {
{Graphics[{EdgeForm[Black], Yellow, Disk[]}], markerSize},
{Graphics[{EdgeForm[Black], Red, Disk[]}], markerSize}
}

],
Background -> LightGray]
]

Better exclusion marking


Comments

Popular posts from this blog

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 - 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 - 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.