2017-02-25 1 views
1

현재 일부 자산 (공유)에 대해 얻은 로그 반환에 대한 상대 빈도 플롯을 구성하려고합니다. 여기서 plt.yscale을 사용하여 y 축에 log10 배율을 사용했습니다 '로그'). 그러나, 나는 명확하게 다음과 같이 내가 파이썬에 건설 내 그래프의 특정 지점에서 무한대로 경향이 일부 수직 라인을 구하십시오상대 주파수 플롯을 수행 한 후 나타나는 수직선을 제거하려면 어떻게합니까? (파이썬 3.5)

이를 분명히 일어나지한다. 대신,이 그래프처럼 보일 것입니다 : 이것은 그 점에 수직 라인을 포함하지 않는 것을 제외하고, 광산 명확하게 유사하다

. 다음과 같이 내 코드는 다음과 같습니다

plt.figure(1) 
plt.figure(figsize=(9,7)) 
hist1, bins1 = np.histogram(returns_assetA_daily_mat, bins=20) 
hist2, bins2 = np.histogram(returns_assetA_weekly_mat, bins=20) 
hist3, bins3 = np.histogram(returns_assetA_monthly_mat, bins=20) 
hist1 = hist1/len(returns_assetA_daily_mat) 
hist2 = hist2/len(returns_assetA_weekly_mat) 
hist3 = hist3/len(returns_assetA_monthly_mat) 
bins1 = 0.5 * (bins1[1:] + bins1[:-1]) 
bins2 = 0.5 * (bins2[1:] + bins2[:-1]) 
bins3 = 0.5 * (bins3[1:] + bins3[:-1]) 
plt.plot(bins1, hist1, bins2, hist2, bins3, hist3) 
plt.yscale('log') 
plt.xlabel('Log-Returns') 
plt.ylabel('Relative Frequency') 
plt.title('Original for Asset A') 
plt.show() 

그것은

returns_assetA_daily_mat, returns_assetA_weekly_mat, returns_assetA_monthly_mat 

단순히 양수, 음수 값을 포함하는 자산의 일일, 주간 및 월간 로그 수익률의 값으로 배열을 행 것을 알고 매우 유용 값과 0도 마찬가지입니다. 아마도 y 축에서 log10 스케일을 수행하고 있기 때문에 음수 값 또는 0이 분명히 x가 0 인 경향이 있기 때문에 근본적인 문제의 원인이 될 수 있습니다. 어쩌면 내 코드 구조 내에 문제가 있습니까? 이 문제에 대한 해결책이 없다면 수직선을 포함하는 점을 음의 무한대로 분리하여 격리 된 점처럼 보이게 할 수있는 방법이 있습니까? 저는 파이썬 초보자로서 현재 Computational Finance에서 석사 학위의 일부로 그것을 배우고 있습니다. 그래서 어떤 종류의 도움도 매우 높이 평가 될 것입니다! 많은 감사드립니다!

답변

0

Matplotlib에서 플롯에서 시각적으로 점을 "제거"하는 한 가지 방법은 영향을받는 점을 numpy.nan으로 설정하는 것입니다. 이 효과는 numpy.nan 전후의 포인트가 내가 당신이 생각하는 차이가 있다는 것을 보여줍니다.

따라서 배열의 경우 음수 또는 0 인 값을 찾아 플롯하기 전에 numpy.nan으로 설정하십시오. 히스토그램을 계산하기 때문에이 값은 음의 값을 생성해서는 안되며, 실제로는 0과 동일한 빈을 확인하는 것입니다.

배열의 유형을 float으로 변경해야합니다. numpy.nan은 부동 소수점 배열에만 존재합니다.

plt.figure(1) 
plt.figure(figsize=(9,7)) 
hist1, bins1 = np.histogram(returns_assetA_daily_mat, bins=20) 
hist2, bins2 = np.histogram(returns_assetA_weekly_mat, bins=20) 
hist3, bins3 = np.histogram(returns_assetA_monthly_mat, bins=20) 
hist1 = hist1/len(returns_assetA_daily_mat) 
hist2 = hist2/len(returns_assetA_weekly_mat) 
hist3 = hist3/len(returns_assetA_monthly_mat) 
bins1 = 0.5 * (bins1[1:] + bins1[:-1]) 
bins2 = 0.5 * (bins2[1:] + bins2[:-1]) 
bins3 = 0.5 * (bins3[1:] + bins3[:-1]) 

# New code 
hist1_new = hist1.astype(np.float) 
hist2_new = hist2.astype(np.float) 
hist3_new = hist3.astype(np.float) 
hist1_new[hist1 <= 0] = np.nan 
hist2_new[hist2 <= 0] = np.nan 
hist3_new[hist3 <= 0] = np.nan 

# New - Plot the three graphs separately for making the legend 
# Also plot the NaN versions 
plt.plot(bins1, hist1_new, label='Daily') 
plt.plot(bins2, hist2_new, label='Weekly') 
plt.plot(bins3, hist3_new, label='Monthly') 

plt.yscale('log') 
plt.xlabel('Log-Returns') 
plt.ylabel('Relative Frequency') 
plt.title('Original for Asset A') 
plt.legend() # Added for the legend 
plt.show() 
:

당신은 또한 전설을 추가하도록 각각의 플롯하려면, 간단히 범례를 추가 matplotlib.pyplot.plot 세 번 호출하여 같은 그림에 한 번에 각 배열을 플롯 한 후 플롯을 보여


나는 당신의 데이터가없는,하지만 난 당신이 작업의 장난감 예를 표시 할 수 있습니다 : 두 번째 플롯 내가 수행함을

# Import relevant packages 
import numpy as np 
import matplotlib.pyplot as plt 

# Create array from 0 to 8 for the horizontal axis 
x = np.arange(9) 

# Create test array with some zero, positive and negative values 
y = np.array([1, 2, 3, 0, -1, -2, 1, 2, -1]) 

# Create a figure with two graphs in one row 
plt.subplot(1, 2, 1) 

# Graph the data normally 
plt.plot(x, y) 

# Visually remove those points that are zero or negative 
y2 = y.astype(np.float) 
y2[y2 <= 0] = np.nan 

# Plot these points now 
plt.subplot(1, 2, 2) 
plt.plot(x, y2) 

# Adjust the x and y limits (see further discussion below) 
plt.xlim(0, 8) 
plt.ylim(-1, 3) 

# Show the figure 
plt.show() 

주를 x 및 012,371 그한계는 첫 번째 플롯과 동일합니다. 왜냐하면 시각적으로 점을 제거하기 때문에 축이 자동으로 조정되기 때문입니다.우리는 얻을 :

enter image description here

+0

너무 감사합니다! 그것은 매우 도움이되었고, 나는 확실히 그것이 효과가 있다고 말할 수있어서 기쁩니다! – Jayjay95

+0

@ Jayjay95 아하, 아주 멋지다. 나에게 필요한 것이 있다면 나에게 알려줘. 기꺼이 수정 해줘. 그 밖의 것이 없다면이 문제에 대해 더 이상 도움이 필요 없다는 것을 지역 사회에 알리기 위해 내 대답을 수락하는 것을 고려해보십시오. 행운을 빕니다! – rayryeng

+0

한 가지 더 질문합니다. 아마도 더 사소한 질문 일 것입니다. plt.plot() 함수 내에서 세 가지 다른 그래프를 입력 했으므로 세 가지 별도의 레이블을 추가하는 방법 (일별, 주별, 월별로 레이블의 이름이됩니다)) 그래프에 범례를 추가하려면? 현재 "일별"과 같은 레이블 이름을 추가하면이 이름이 월별 또는 일별 데이터에 속하는지 여부에 관계없이 세 가지 다른 플롯에 모두 할당됩니다. 다시 한 번 감사드립니다! :) – Jayjay95

관련 문제