2017-11-11 5 views
0

matplotlib에서 사용되는 여러 가지 방법으로 길을 잃고 있습니다.컬러 막대 및 날짜/시간 축 틱이있는 분산 형 플롯

측면에 색상 막대가 있고 x 축에 날짜 시간이있는 색상으로 구분 된 산점도를 만들고 싶습니다.

그러나 내 ax을 정의하는 방법에 따라 다른 오류가 발생합니다. 다음은 내 코드의 핵심입니다 : 내가 지정하는 경우

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.cm as cm 
import matplotlib.dates as mdates 

#.....loading files etc. 

norm = mcolors.Normalize(vmin=0,vmax=1000) 
timerange = pd.date_range(start='2015-01-01', end='2016-01-01', freq='30D') 

### PLOTTING 
fig = plt.figure(figsize=(6.,5)) 
ax = fig.add_subplot(111) 

for Af in Afiles: 
    for index, row in Af.iterrows(): 
     time = pd.to_datetime(row['date'], format="%Y-%m-%d") 
     plt.scatter(time, row['A'], c=row['z'], norm=norm, cmap=colormap,edgecolor='k', lw=0.8, s=80) 

plt.xticks(timerange, rotation=90) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m/%Y")) 
plt.xlabel('Time', fontsize=11, color='k') 

clb = fig.colorbar(ax)  
clb.ax.set_title('Value', y=-0.125, fontsize=11) 
clb.ax.invert_yaxis() 

fig.tight_layout() 

AttributeError: 'AxesSubplot' object has no attribute 'autoscale_None'

을 생산하지만 내 ax 내 컬러 코딩 작업을 얻을 수 있도록 산포도, 나는 다음에 문제를 가지고 축 포맷터. 대신 ax = plt.scatter을 쓰면 AttributeError: 'PathCollection' object has no attribute 'xaxis'가 생성됩니다.

어떻게 색 막대와 서식 지정된 축 눈금을 모두 가질 수 있습니까?

답변

1

가 산란을 호출하지 마십시오 ax. (기존 축을 덮어 씁니다. ax)
컬러 바는 첫 번째 인수로 ScalarMappable (예 : scatter)을 필요로합니다. 없앤다 모든 정규화 때문에, 당신은 동일하게 유지해야 루프에서

다음
norm = plt.Normalize(...) 
for bla in blubb: 
    scatter = plt.scatter(..., norm=norm) 

,

clb = fig.colorbar(scatter) 

나머지를 사용할 수 있습니다.

+0

물론! 어리석은 나, 고마워. 이건 창피해. – durbachit

0

기본 아이디어는 색상 막대에 축을 추가해야한다는 것입니다.

데이터와 함께 작동하는 예제를 제공하지 않았으므로 정확하게 일치하는지 알기가 어렵습니다. 그러나 이것은 최소한 템플리트 역할을 할 수 있습니다.

첫째, 몇 가지 예를 들어 데이터 :

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import matplotlib.cm as cm 
import matplotlib.dates as mdates 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

vmin = 0 
vmax = 1000 
timerange = pd.date_range(start='2015-01-01', end='2016-01-01', freq='30D') 
N = len(timerange) 

data = np.random.randint(vmin, vmax, size=N) 
# z contains the colorbar values for each point 
cmap = plt.get_cmap('Reds') 
z = [cmap((x-vmin)/(vmax-vmin))[:3] for x in data] 
df = pd.DataFrame({"value":data, "datetime":timerange, "z":z}) 

지금 줄거리 :

fig = plt.figure(figsize=(6.,5)) 
ax = fig.add_subplot(111) 

plt.scatter(x=df.datetime.values, y=df.value.values, c=df.z) 

ax.set_xticklabels(timerange, rotation=90) 
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m/%Y")) 
ax.set_xlabel('Time') 

지금 년 Colorbar을 추가

norm = mcolors.Normalize(vmin=vmin,vmax=vmax) 
m = cm.ScalarMappable(cmap='Reds', norm=norm) 
m.set_array([(x-vmin)/(vmax-vmin) for x in df.value.values]) 

divider = make_axes_locatable(ax) 
cax = divider.append_axes("right", size="5%", pad=0.1) 
clb = plt.colorbar(m, cax=cax) 

scatter plus colormap

+0

죄송합니다. 명확히하기 위해 내 루프에서 어떻게 작동합니까? 단일 데이터 프레임이 아닌 많은 스칼라를 mappable로 설정하려면 어떻게해야합니까? 다양한 값 범위가있는 많은 데이터 프레임에 대해 공통 색상 표 (공통 색상 표)가 필요합니다. 컬러 바에 대한 코드 ('ax = plt.scatter'를 설정할 때)는 숫자 x 축을 유지하는 한 완벽하게 작동했습니다. 문제는 내가 축 포맷으로 재생하기 시작할 때 나타났다. – durbachit

+0

일반적인 색상 막대가 필요한 경우 색상 막대와 관련하여 다양한 범위가 없으므로 색상 막대가 하나만 있습니다. 전체 데이터 세트의 최소값과 최대 값을 선택하여 선택 가능 항목을 설정하십시오. 루프는 동일하게 유지 될 수 있습니다. 예제를 제공하기 위해 하나의 데이터 프레임에 대한 예제 데이터를 만들었습니다. –

+1

그 말은, ImportanceOfBeingErnest의 대답은 더 간단하고, Matplotlib에 관해서는 우아함에 대한 좋은 감각이 없다는 것을 처음으로 인정할 것입니다. 그의 접근 방법을 시도해보십시오! –

관련 문제