Este equipo redactor ha pasado mucho tiempo investigando soluciones a tus dudas, te ofrecemos la solución y nuestro deseo es resultarte de gran ayuda.
Solución:
Yo prefiero usar Graphics
y Inset
Haz esta figura de exhibición amable. Requiere un poco más de trabajo, pero proporciona una gran flexibilidad en la colocación de los elementos. Para ilustrar el enfoque, presento dos versiones de su figura. La primera es un arreglo que personalmente encuentro agradable; el segundo está más cerca de lo que muestra en su pregunta.
Data de muestra
SeedRandom[1];
data = RandomReal[BinormalDistribution[0, 0, 1, 1, 0.5], 50];
histData1, histData2 = Transpose @ data;
dataPlot = Graphics[Point @ data, Frame -> True];
Enmarcado con datos de ejes completos
histPlot1 = Histogram[histData1, 15, AspectRatio -> 1/5];
histPlot2 = Histogram[histData2, 12, AspectRatio -> 3, BarOrigin -> Left];
Framed[
Graphics[
Text[Style["Plot Label", "SR", 16], Scaled @ .5, .96],
Inset[dataPlot, Scaled @ .05, .03, Scaled @ 0, 0, Scaled[.73]],
Inset[histPlot1, Scaled @ .05, .77, Scaled @ 0, 0, Scaled[.7]],
Inset[histPlot2, Scaled @ .77, .03, Scaled @ 0, 0, Scaled[.75]],
PlotRange -> MinMax /@ histData1, histData2,
PlotRangePadding -> .01, .33, .0, .33 /. u_Real -> Scaled[u],
ImageSize -> 500, 450]]
Sin marco con histogramas en el marco del diagrama de dispersión
histPlot3 = Histogram[histData1, 15, AspectRatio -> 1/5, Ticks -> None, Automatic];
histPlot4 =
Histogram[histData2, 12,
AspectRatio -> 3, BarOrigin -> Left, Ticks -> Automatic, None];
Graphics[
Text[Style["Plot Label", "SR", 16], Scaled @ .40, .96],
Inset[dataPlot, Scaled @ .05, .03, Scaled @ 0, 0, Scaled[.77]],
Inset[histPlot3, Scaled @ .05, .76, Scaled @ 0, 0, Scaled[.7]],
Inset[histPlot4, Scaled @ .7645, .03, Scaled @ 0, 0, Scaled[.75]],
PlotRange -> MinMax /@ histData1, histData2,
PlotRangePadding -> .01, .33, .0, .33 /. u_Real -> Scaled[u],
ImageSize -> 500, 450]
Incluso si ninguna de estas cifras es exactamente lo que está buscando, creo que estos ejemplos muestran la versatilidad de este enfoque. Espero que puedas adaptarte a tus necesidades.
En lugar de jugar manualmente con Inset como lo sugiere m_goldberg, el enlace proporcionado por abdullah al plotGrid
La función escrita por Jens hizo el 99% de lo que quería automáticamente. Solo tomó un If
para probar si un elemento de la lista es un Graphics
o no llevarlo a donde quería. También modifiqué las opciones para permitir el relleno interno de las figuras.
El código modificado está debajo de las figuras.
p.ej,
plotGrid[histPlot1, None, listPlot, histPlot2, 500, 500,
sidePadding -> 40, internalSidePadding -> 0]
plotGrid[histPlot1, None, listPlot, histPlot2, 500, 500,
sidePadding -> 40, internalSidePadding -> 10]
Claro[plotGrid]
plotGrid::usage = "plotGrid[listOfPlots_, imageWidth_:720,
imageHeight_:720, Options] creates a grid of plots from the list
which allows the plots to the same axes with various padding options.
For an empty cell in the grid use None or Null. Additional options
are: ImagePadding[Rule]40, 40,40, 40, InternalImagePadding
[Rule]0, 0,0, 0. ImagePadding can be given as an option for
the figure as well nCode modified from:
https://mathematica.stackexchange.com/questions/6877/do-i-have-to-
code-each-case-of-this-grid-full-of-plots-separately"
Options[plotGrid] =
Join[sidePadding -> 40, 40, 40, 40 ,
internalSidePadding -> 0, 0, 0, 0 , Options[Graphics]];
plotGrid[l_List, w_: 720, h_: 720, opts : OptionsPattern[]] :=
Module[nx, ny, sidePadding = OptionValue[plotGrid, sidePadding],
internalSidePadding = OptionValue[plotGrid, internalSidePadding],
topPadding, widths, heights, dimensions, positions, singleGraphic,
frameOptions =
FilterRules[opts,
FilterRules[Options[Graphics], Except[Frame, FrameTicks]]],
(*expand [
internal]SidePadding arguments to 4 in case given as single
argument or in older form of 1 arguments *)
Switch[Length[sidePadding // Flatten],
2, sidePadding = sidePadding[[2]],
sidePadding[[2]], sidePadding[[1]], sidePadding[[1]],
4, sidePadding = sidePadding,
_, sidePadding = sidePadding, sidePadding, sidePadding,
sidePadding
];
Switch[Length[internalSidePadding // Flatten],
2, internalSidePadding = internalSidePadding[[2]],
internalSidePadding[[2]], internalSidePadding[[1]],
internalSidePadding[[1]],
4, internalSidePadding = internalSidePadding,
_, internalSidePadding = internalSidePadding,
internalSidePadding, internalSidePadding, internalSidePadding
];
ny, nx = Dimensions[l];
widths = (w - (Plus @@ sidePadding[[1]]))/nx Table[1, nx];
widths[[1]] = widths[[1]] + sidePadding[[1, 1]];
widths[[-1]] = widths[[-1]] + sidePadding[[1, 2]];
heights = (h - (Plus @@ sidePadding[[2]]))/ny Table[1, ny];
heights[[1]] = heights[[1]] + sidePadding[[2, 1]];
heights[[-1]] = heights[[-1]] + sidePadding[[2, 2]];
positions =
[email protected]
Partition[
Tuples[Prepend[Accumulate[Most[#]], 0] & /@ widths, heights],
ny];
Graphics[Table[
singleGraphic = l[[ny - j + 1, i]];
If[Head[singleGraphic] === Graphics,
Inset[Show[singleGraphic,
ImagePadding -> (If[i == 1, sidePadding[[1, 1]], 0],
If[i == nx, sidePadding[[1, 2]], 0], If[j == 1,
sidePadding[[2, 1]], 0],
If[j == ny, sidePadding[[2, 2]], 0] +
internalSidePadding), AspectRatio -> Full],
positions[[j, i]], Left, Bottom, widths[[i]], heights[[j]]]
], i, 1, nx, j, 1, ny], PlotRange -> 0, w, 0, h,
ImageSize -> w, h, [email protected][Sequence, frameOptions]]]
Si no le importa tener histogramas en los marcos izquierdo e inferior, puede usar DensityHistogram
con el Method
subopción "DistributionAxes"
.
Con este enfoque, además de los histogramas, puede tener un gráfico de caja-bigotes, un histograma suave o una alfombra de datos para representar las distribuciones marginales de los datos de entrada:
SeedRandom[1]
data = RandomReal[BinormalDistribution[0, 0, 1, 1, 0.5], 300];
DensityHistogram[data, 15, 12, ImageSize -> Medium,
ColorFunction -> (Blend[LightRed, Red, #] &),
Method -> "DistributionAxes" -> #,
PlotLabel -> Style[#, 16],
ChartElementFunction -> (ChartElementData["Rectangle"][##],
Black, AbsolutePointSize @ 3, Point @ #2 &)] & /@
"Histogram", "Lines", "BoxWhisker", "SmoothHistogram"
Multicolumn[%, 2] &
Si desea eliminar colores de los contenedores 2D, use `ColorFunction -> (White &) para obtener:
Nota: Usé una costumbre ChartElementFunction
para agregar los puntos de datos anteriores. Alternativamente, puede reemplazar la opción ChartElementFunction -> ...
con
Epilog -> First[ListPlot[data,
PlotStyle -> Directive[Black, AbsolutePointSize @ 3]]]
para obtener la misma imagen.
Ten en cuenta comunicar esta crónica si te ayudó.