Skip to main content

plotting - How can I create a rectangular graphic with curved edges?


I want to make some button shaped graphics that would essentially be a rectangular shape with curved edges. In the example below I have used Polygon rather than Rectangle so as to take advantage of VertexColors and have a gradient fill. The code below illustrates the sort of thing I want in so far as the Frame with RoundingRadius shows where I want the boundaries of the Graphic to be cut off (for example).


Framed[Graphics[{

Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}},
VertexColors -> {Red, Red, Blue, Blue}]
},
AspectRatio -> 0.2,
ImagePadding -> 0,
ImageMargins -> 0,
ImageSize -> 200,
PlotRangePadding -> 0],
ContentPadding -> True,
FrameMargins -> 0,

ImageMargins -> 0,
RoundingRadius -> 20]

I'm thinking there is probably a very straight forward way of accomplishing this. Is there some way to exclude parts of the Graphic that fall outside the Frame from displaying? Any alternative methods would be welcome.


Edit


I had been expecting that this was going to be possible with existing options rather than having to write functions. @Mr.Wizard provided a concise solution from existing built in functionality but I ultimately didn't want a raster solution. @Heike used RegionPlot like the others, but in a way in which the user, i.e. me, could implement it by simply changing a rounding radius parameter, so that makes it a more straight forward solution IMO.



Answer



This answer uses RegionPlot to plot the rounded rectangle. In roundedRect, {{xmin, xmax}, {ymin, ymax}} is the range of the rectangle and rad the rounding radius. roundedRect accepts any option of RegionPlot, in particular ColorFunction which you can use to shade the rectangle.


Options[roundedRect] = Options[RegionPlot];
SetOptions[roundedRect, {Frame -> False, Axes -> False, BoundaryStyle -> None}];


roundedRect[range : {{xmin_, xmax_}, {ymin_, ymax_}}, rad_,
opt : OptionsPattern[roundedRect]] := Module[{p, norm},
p = 1/Log2[Sqrt[2] + 2];
norm[pt_, pt0_] := Total[Abs[pt - pt0]^p]^(1/p) > rad;
RegionPlot[And @@ (norm[{x, y}, #] & /@ Tuples[range]),
{x, xmin, xmax}, {y, ymin, ymax}, opt,
AspectRatio -> Abs[ymax - ymin]/Abs[xmax - xmin],
Evaluate[Options[roundedRect]]]]


Example


roundedRect[{{0, 5}, {0, 1}}, .4, ColorFunction -> (Blend[{Red, Blue}, #2] &)]

Mathematica graphics


Edit


@Heike I hope you do not mind me making a change to your answer. I think this is more Mathematica like by having the rounding radius as an option.


ClearAll[roundedRect];

Options[roundedRect] = Flatten[{RoundingRadius -> 0.5, Options[RegionPlot]}];
SetOptions[roundedRect, {Frame -> False, Axes -> False, BoundaryStyle -> None}];


roundedRect[range : {{xmin_, xmax_}, {ymin_, ymax_}},
opt : OptionsPattern[roundedRect]] := Module[{p, norm, opts, rad},

rad = OptionValue[RoundingRadius];
opts = FilterRules[{opt}, Options[RegionPlot]];

p = 1/Log2[Sqrt[2] + 2];
norm[pt_, pt0_] := Total[Abs[pt - pt0]^p]^(1/p) > rad;


RegionPlot[
And @@ (norm[{x, y}, #] & /@ Tuples[range]), {x, xmin, xmax}, {y,
ymin, ymax}, Evaluate@opts,
AspectRatio -> Abs[ymax - ymin]/Abs[xmax - xmin]]]

example:


roundedRect[{{0, 5}, {0, 1}}, Frame -> False, RoundingRadius -> 0.4, 
ColorFunction -> (Blend[{Red, Blue}, #2] &)]

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