2010-08-11 24 views
23

¿Cómo trazar leyendas para funciones sin usar el paquete PlotLegends?trazando leyendas en Mathematica

+0

¿Qué es lo que está mal con PlotLegends? Quiero decir, puedes hacer leyendas sin él (ver mi respuesta) pero es kludgy en el mejor de los casos. – Timo

+6

@Timo Lamento decirlo, pero las leyendas son un poco feas. Una gran caja, con el contenido ampliamente espaciado. Una sombra paralela por defecto que nadie usa. Numerosos artefactos, como se ilustra a continuación (pero hay más). –

+0

@Sjoerd: No lo siento, estoy de acuerdo en que son feos. Pero esa probablemente no fue la razón por la cual el OP publicó esta pregunta, por lo tanto, pregunto con qué específicamente tiene problemas. – Timo

Respuesta

7

También me interesaría mucho recibir una respuesta a esta pregunta.

Para decirte lo que está mal con PlotLegends: es terriblemente inestable y en muchos casos no funciona en absoluto.

Aquí hay un ejemplo en el que PlotLegends se estropea por completo. La salida es de Mathematica 7.0:

Supongamos que hemos medido algunos puntos de datos correspondientes a una serie de funciones, y queremos mostrar qué tan bien se comparan con la función ideal, o tal vez qué tan bien coinciden con un ajuste calculado. ¡No hay problema! Simplemente mostraremos [] la trama suave junto con un ListPlot de los puntos de datos, ¿verdad?

Podría ser algo como esto:

Show[ 
Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}], 
ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
       {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]] 
] 

alt text

Ahora nos gustaría poner una leyenda en la parcela, así, los lectores sabrán qué en la tierra que están viendo. Es más fácil decirlo que hacerlo, señor! Vamos a añadir el PlotLegend a la trama []:

Show[ 
    Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}, PlotLegend -> {Sin[x], Sinh[x]}], 
    ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
       {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]] 
] 

alt text

Esto se ve muy bien! Publicar de inmediato!

Para una funcionalidad tan básica y omnipresente, seguramente ha sido mucho trabajo encontrar una alternativa a PlotLegend que funcione. La mejor alternativa que he encontrado hasta ahora ha sido construir meticulosamente una lista de trazados, luego construir la leyenda a mano y finalmente mostrarla junto con la trama usando ShowLegend []. (Ver por ejemplo here) Es posible, pero mucho trabajo.

Así que si alguien sabe de una solución para hacer que funcione PlotLegend, un paquete alternativo que funciona mejor, o simplemente una manera ordenada de obtener leyendas que se puedan automatizar fácilmente, ¡le estaría muy agradecido! Sin duda, haría la vida un poco más fácil.

15

Yo también estaba decepcionado por la dificultad de hacer que PlotLegend funcione correctamente. Escribí mi propia función breve para tomar mis propias calcular aduana leyendas:

makePlotLegend[names_, markers_, origin_, markerSize_, fontSize_, font_] := 
    Join @@ Table[{ 
    Text[ 
     Style[names[[i]], FontSize -> fontSize, font], 
     Offset[ 
     {1.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25}, 
     Scaled[origin] 
     ], 
     {-1, 0} 
    ], 
    Inset[ 
     Show[markers[[i]], ImageSize -> markerSize], 
     Offset[ 
     {0.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25}, 
     Scaled[origin] 
     ], 
     {0, 0}, 
     Background -> Directive[Opacity[0], White] 
    ] 
    }, 
    {i, 1, Length[names]} 
]; 

Es flexible, pero no tan fácil de usar. "nombres" es una lista de cadenas para representar en la leyenda; "marcadores" es una lista con la misma longitud que los "nombres" de los objetos de gráficos que representan los marcadores de la trama o los gráficos para representar; "origen" es una lista de dos elementos con la posición horizontal y vertical absoluta de la esquina superior izquierda de la leyenda; "markerSize" es el número de puntos para escalar los marcadores; "fontSize" es el tamaño de fuente; "font" es el nombre de la fuente a usar. Aquí está un ejemplo:

Plot[{x, x^2}, {x, 0, 2}, PlotStyle -> {Blue, Red}, 
    Epilog -> makePlotLegend[ 
    {x, x^2}, 
    (Graphics[{#, Line[{{-1, 0}, {1, 0}}]}]) & /@ {Blue, Red}, 
    {0.9, 0.3}, 
    12, 
    12, 
    "Arial" 
    ] 
] 

generated image

+0

+1 Solución elegante, gracias por aliviar mi vida – pygabriel

1

Si usted está experimentando el comportamiento extraño descrito por James Cuando está intentando utilizar 'Show' para combinar dos imágenes, entonces usted debe jugar un poco con el uso de la ' Función 'superposición' en lugar de 'Mostrar'.

Como alternativa, he encontrado que, siempre que ambos gráficos tengan una leyenda, 'Mostrar' mostrará la imagen compuesta correctamente.

Si se ve un poco tener tonta dos leyendas entonces se puede quitar el uno del segundo gráfico mediante el uso de opciones como:

PlotLegend -> {}, 
LegendPosition -> {0.1, 0.1}, 
LegendSize -> 0.001, 
LegendShadow -> None, 
LegendBorder -> None 

Esto crea una leyenda vacía e invisible, pero todavía permite estar los dos gráficos compuesto correctamente por 'Mostrar'.