Making a rectangular label for RegionPlot
Perhaps a "quick" appoach (in addition to looking at hyperlink of @rm-rf):
msp[f_, {xmin_, xmax_}, {ymin_, ymax_}, mfun_, mnum_, swatchsize_,
opts : OptionsPattern[]] := Module[{pm, swl},
pm = RegionPlot[x < 1, {x, 0, 1}, {y, 0, 1}, MeshFunctions -> mfun,
Mesh -> IntegerPart@(mnum/(swatchsize/10)), Frame -> False,
PlotRange -> {{0, 1}, {0, 1}},
Evaluate@FilterRules[{opts}, Options[RegionPlot]],
ImageSize -> swatchsize];
swl = SwatchLegend["Expressions", LegendMarkers -> pm,
LegendMarkerSize -> swatchsize];
RegionPlot[f, {x, xmin, xmax}, {y, ymin, ymax},
MeshFunctions -> mfun, Mesh -> mnum,
Evaluate@FilterRules[{opts}, Options[RegionPlot]],
PlotLegends -> swl]]
Some examples:
msp[x^2 + y^3 < 2, {-2, 2}, {-2, 2}, {#1 &, #2 &}, 50, 50]
msp[x^2 + y^3 < 2, {-2, 2}, {-2, 2}, {#1 + #2 &, #1 - #2 &}, 50, 50]
msp[x^2 + y^3 < 2, {-2, 2}, {-2, 2}, {#1 &, #2 &}, 50, 50,
PlotStyle -> Yellow, BoundaryStyle -> {Thick, Purple}]
UPDATE
mspmod[f_, {xmin_, xmax_}, {ymin_, ymax_}, mfun_, mnum_, swatchsize_,
col_, opts : OptionsPattern[]] :=
Module[{pm, swl},
pm = RegionPlot[x < 1, {x, 0, 1}, {y, 0, 1}, MeshFunctions -> mfun,
Mesh -> IntegerPart@(mnum/(swatchsize/10)), Frame -> False,
PlotRange -> {{0, 1}, {0, 1}}, PlotStyle -> #,
Evaluate@FilterRules[{opts}, Options[RegionPlot]],
ImageSize -> swatchsize] & /@ col;
swl = SwatchLegend["Expressions", LegendMarkers -> pm,
LegendMarkerSize -> swatchsize];
RegionPlot[f, {x, xmin, xmax}, {y, ymin, ymax},
MeshFunctions -> mfun, Mesh -> mnum, PlotStyle -> col,
Evaluate@FilterRules[{opts}, Options[RegionPlot]],
PlotLegends -> swl]]
Example:
mspmod[{x^3 - y^2 > 2, x^2 + y^3 > 3,
x^3 - y^2 > 2 && x^2 + y^3 > 3}, {-3, 3}, {-3, 3}, 50, 50, {Red,
Green, Yellow}]
You can also create hatched images (say, img
) using ParametricPlot
and use them with PlotStyle -> Texture[img]
in RegionPlot
:
Reusing the function hatchF
from this answer:
ClearAll[hatchF]
hatchF[mf_List: {# &, #2 &}, mesh_List: {50, 50},
style_: GrayLevel[.5], opts : OptionsPattern[]] :=
ParametricPlot[{x, y}, {x, 0, 1}, {y, 0, 1}, Mesh -> mesh,
MeshFunctions -> mf, MeshStyle -> style, BoundaryStyle -> None,
opts, Frame -> False, PlotRangePadding -> 0, ImagePadding -> 0, Axes -> False]
t1a = hatchF[{# - #2 &}, {60}, Red, PlotStyle -> Opacity[.5, Yellow]];
t1b = hatchF[{# + #2 &}, {60}, Purple, PlotStyle -> Opacity[.5, Cyan]];
t2a = hatchF[{# + #2 &}, {80}, None, MeshShading -> {None, Blue}];
t2b = hatchF[{# - #2 &}, {80}, None, MeshShading -> {Red, None}];
t3 = ExampleData[{"TestImage", "Lena"}];
t4 = ImageCrop[ExampleData[{"ColorTexture", "Metal4"}], {600, 600}];
Grid[Transpose@Partition[{t1a, t1b, t2a, t2b, t3, t4}, 2]]
funcs = {Abs[x^3 - y^2] > 2, x^2 + y^3 < 1/2};
labels = Append[TraditionalForm /@ #, TraditionalForm[And @@ #]] & @ funcs;
markers = Append[ImageCrop[#, 30] & /@ {t1a, t1b}, ImageCrop[Show[t1a, t1b], 30]];
legend = Grid[Transpose[{markers, labels}], Alignment -> Left];
Legended[#, legend] &@
RegionPlot[funcs, {x, -2, 2}, {y, -2, 2},
PlotStyle -> {{Opacity[.5], Texture @ t1a}, {Opacity[.5], Texture @ t1b}}]
In versions 11.0+, use
PlotStyle -> {Texture @ SetAlphaChannel[t1a, .5], Texture @ SetAlphaChannel[t1b, .5]}
Use t2a
and t2b
in places of t1a
and t1b
to get:
Use t3
in place of t2
and
markers = Append[ImageCrop[#, 30] & /@ {t2a, ImageResize[t3, {50, 50}]},
ImageCrop[Show[SetAlphaChannel[ImageResize[t3, {50, 50}], .9],
SetAlphaChannel[t2a, .3]], 30]];
to get
Replace t3
with t4
to get