Saltar al contenido

Combinando histogramas con un diagrama de dispersión

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

Figura 1

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]

Figura 2

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]

Sin acolchado interno

plotGrid[histPlot1, None, listPlot, histPlot2, 500, 500, 
 sidePadding -> 40, internalSidePadding -> 10]

con acolchado interno
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] &

ingrese la descripción de la imagen aquí

Si desea eliminar colores de los contenedores 2D, use `ColorFunction -> (White &) para obtener:

ingrese la descripción de la imagen aquí

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *