2010-08-11 3 views
23

PlotLegends 패키지를 사용하지 않고 어떻게 함수에 대한 범례를 플롯합니까?Mathematica에서 범례 플로팅하기

+0

구체적으로 PlotLegends에 어떤 문제가 있습니까? 내 말은, 당신은 그것없이 전설을 할 수있다 (나의 대답을 보라). 그러나 그것은 기껏해야 울퉁불퉁하다. – Timo

+6

@Timo 말하기는 유감 스럽지만 전설은 다소 추합니다. 콘텐츠가 넓게 배치 된 거대한 상자. 아무도 사용하지 않는 기본적으로 그림자입니다. 아래에 삽화처럼 많은 공예품이 있습니다 (그러나 더 많은 것들이 있습니다). –

+0

@Sjoerd : 미안하지 마라, 나는 그들이 추한 것에 동의한다. 그러나 이것이 OP가이 질문을 게시 한 이유가 아니기 때문에 문제가 무엇인지 구체적으로 물어 봤습니다. – Timo

답변

7

나는 또한이 질문에 대한 답에 매우 흥미가있을 것이다.

PlotLegends의 문제점 : 대단히 불안정하며 대부분의 경우 전혀 작동하지 않습니다.

여기 PlotLegends가 완전히 위로 올라가는 예가 나와 있습니다. 출력은 Mathematica 7.0에서 나온 것입니다 :

많은 함수에 해당하는 몇 가지 데이터 포인트를 측정하고 이상적인 함수와 얼마나 잘 비교했는지 계산 된 피트와 얼마나 잘 일치하는지 보여주고 싶다고 가정합니다. 문제 없어! 데이터 포인트의 ListPlot과 함께 부드러운 플롯을 표시합니다.

그것은이 같은 것을 볼 수 있었다 : 독자들이보고있는이 땅에서 무엇을 알 수 있도록

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

alt text

이제 우리는, 플롯 범례를 넣어 싶습니다. 더 쉽게 말했어, 아저씨! 의는 [] 플롯에 PlotLegend를 추가하자

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

이것은 멋지다! 즉시 게시하십시오!

이러한 기본적이고 보편적으로 필요한 기능을 위해서는 PlotLegend 대신 사용할 수있는 대안을 찾아야합니다. 지금까지 발견 한 가장 좋은 대안은 꼼꼼하게 줄거리 목록을 작성한 다음 손으로 범례를 작성하고 마지막으로 ShowLegend []를 사용하여 줄거리와 함께 표시하는 것입니다. (예 : here 참고) 가능하지만 많은 작업이 필요합니다.

PlotLegend가 작동하는 대안을 알고있는 사람, 잘 작동하는 대체 패키지 또는 쉽게 자동화 할 수있는 전설을 얻기위한 깔끔한 방법을 알고 있다면 매우 감사 할 것입니다. 그것은 확실히 인생을 조금 더 쉬울 것입니다.

15

PlotLegend가 제대로 작동하지 않아서 실망했습니다. 내 자신의 사용자 정의 그림 범례를 만들기 위해 간단한 기능을 썼습니다.

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

유연하지만 사용하기는 쉽지 않습니다. "names"는 범례에서 렌더링 할 문자열 목록입니다. "마커"는 렌더링 할 플롯 마커 또는 그래픽을 나타내는 그래픽 객체의 "이름"과 길이가 같은 목록입니다. "origin"은 범례의 왼쪽 위 모서리의 절대 가로 및 세로 위치가있는 두 요소 목록입니다. "markerSize"는 마커를 스케일 할 포인트 수입니다. "fontSize"는 글꼴 크기입니다. "font"는 사용할 글꼴의 이름입니다. 다음은 예입니다

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 우아한 솔루션, 내 인생을 편하게 해줘서 고마워. – pygabriel

1

당신이 두 이미지를 결합하는 '쇼'를 사용하려고 할 때 제임스에 의해 기술되는 이상한 문제가 발생하는 경우, 당신은 사용 함께 놀러해야 ' 오버레이 '기능을 제공합니다.

또는 두 그래픽에 범례가있는 경우 '표시'를 선택하면 합성 이미지가 올바르게 렌더링됩니다.

는 약간 바보 다음과 같은 옵션을 사용하여 두 번째 그래픽에서 하나를 제거 할 수있는 두 전설을 가진 보인다면 :

이 여전히 비어 보이지 않는 전설을 만들지 만
PlotLegend -> {}, 
LegendPosition -> {0.1, 0.1}, 
LegendSize -> 0.001, 
LegendShadow -> None, 
LegendBorder -> None 

두 그래픽이 될 수 있습니다 '쇼'에 의해 정확하게 구성됩니다.