2015-01-21 8 views
4

서브 플로트를 사용하여 많은 데이터를 플롯하려고하는데 문제가되지는 않지만이를 수행 할 수있는 편리한 방법이 있는지 궁금합니다.2 차원 서브 플로트에서 1-D처럼 루프

아래의 샘플 코드가 있습니다.

import numpy as np  
import math 
import matplotlib.pyplot as plt 

quantities=["sam_mvir","mvir","rvir","rs","vrms","vmax" 
,"jx","jy","jz","spin","m200b","m200c","m500c","m2500c" 
,"xoff","voff","btoc","ctoa","ax","ay","az"] 

# len(quantities) = 21, just to make the second loop expression 
# shorter in this post. 

ncol = 5 
nrow = math.ceil(21/ncol) 

fig, axes = plt.subplots(nrows = nrow, ncols=ncol, figsize=(8,6)) 

for i in range(nrow): 
    for j in range(((21-i*5)>5)*5 + ((21-i*5)<5)*(21%5)): 
     axes[i, j].plot(tree[quantities[i*ncol + j]]) 
     axes[i, j].set_title(quantities[i*ncol + j]) 

이 코드는 2D 플롯의 서브 플로트를 반복하고 21 번째 플롯에서 멈추어 4 개의 패널을 비워 둡니다. 제 질문은이 작업을 수행하는 기본 제공 방법이 있습니까? 예를 들어 2D 서브 플롯 배열을 만들고 배열을 1D로 "평평하게"한 다음 1D 배열을 0에서 20까지 반복합니다.

두 번째 범위()의 표현식은 매우 추합니다. 나는이 코드를 사용하지 않을 것이라고 생각한다. 사소한 방법은 플롯의 수를 세고 개수가 21보다 많을 때 중단하는 것이라고 생각합니다. 그러나 더 나은 (멋진) 방법이 있는지 궁금합니다.

답변

6

plt.subplots을 사용하여 미리 하위 그림을 작성하는 대신 plt.subplot(nrows, ncols, number)을 사용하여 하위 그림을 작성하면됩니다. 아래의 작은 예제에서는이를 수행하는 방법을 보여줍니다. 이 플롯의 3 × 3 배열을 생성 만 그려있어 첫 6

import numpy as np 
import matplotlib.pyplot as plt 

nrows, ncols = 3, 3 

x = np.linspace(0,10,100) 

fig = plt.figure()  
for i in range(1,7): 
    ax = fig.add_subplot(nrows, ncols, i) 
    ax.plot(x, x**i) 

plt.show() 

Example

당신은 plt.subplot(nrows, ncols, i)을하고 있지만 당신이 무엇을의 경우 (이 어떤 음모를 꾸미고을 호출하지 않음으로써 과정의 마지막 3를 채울 수 싶었다).

import numpy as np 
import matplotlib.pyplot as plt 

nrows, ncols = 3, 3 

x = np.linspace(0,10,100) 

fig = plt.figure()  
for i in range(1,10): 
    ax = fig.add_subplot(nrows, ncols, i) 
    if i < 7: 
     ax.plot(x, x**i) 

plt.show() 

Example 2

님께 GridSpec의 모습처럼.

+0

아 ..... 그게 내가 내 질문에 대답하는 것 아무것도 찾을 수있는 이유 ...! 질문은 유효하지 않았습니다. 고마워요! 빨리되었습니다. –

+0

이런 식으로 할 경우 최소한'fig.add_subplot'을 사용하여 상태 시스템이 반격하지 않도록해야합니다. – tacaswell

5

subplots가 축 객체의 ndarray를 반환, 당신은 단지 평평하거나 라벨 수 :

fig, axes = plt.subplots(nrows = nrow, ncols=ncol, figsize=(8,6)) 
for ax in axes.flatten()[:20]: 
    # do stuff to ax