2017-01-12 62 views
3

我要繪製數據的CDF對數正態分佈概率圖一樣,如下圖所示:Python的對數正態分佈概率圖

enter image description here

我想對我的陰謀軸鱗像她那樣,只有翻轉(在x軸上有概率)。請注意,上面的y軸不僅僅是一個對數刻度。此外,我不知道爲什麼x軸重複1-9而不是去10-99等,但忽略該部分。

這是我到目前爲止。我使用的方法,使一個CDF所概述here

mu, sigma = 3., 1. # mean and standard deviation 
data = np.random.lognormal(mu, sigma, 1000) 

#Make CDF 
dataSorted = np.sort(data) 
dataCdf = np.linspace(0,1,len(dataSorted)) 

plt.plot(dataCdf, dataSorted) 
plt.gca().set_yscale('log') 
plt.xlabel('probability') 
plt.ylabel('value') 

enter image description here

現在我只需要一種方法來擴大我的x軸,如y軸是在上面的圖片。

+1

這是你需要什麼:[劇情數軸與python中matplotlib(http://stackoverflow.com/questions/773814/plot-logarithmic-axes-with-matplotlib-in -蟒蛇)? – Lucas

+1

如何從當前的代碼製作x軸對數不明顯? set_yscale('log')' - >'plt.gca()。set_xscale('log')' –

+0

x-scale(或示例軸中的y-scale)不是對數。爲了清晰起見,我更改了示例軸圖像。 「中」概率值彼此接近,大/小的概率值進一步分開。它的對數可以達到0.5,反向對數從0.5到1 – hm8

回答

2

解決此問題的一種方法是使用稱爲symlog的對稱記錄縮放比例。

Symlog是一個對數圖,該圖在0的某個範圍內(正常的對數圖顯示無窮多十年)會呈線性運行,因此實際上可能會出現穿越0的對數圖。

可以使用ax.set_xscale('symlog', linthreshx=0.1)在matplotlib中設置Symlog,其中linthreshx表示圍繞零的線性範圍。因爲在這種情況下,我們希望圖形的中心位於0.5而不是0,所以我們實際上可以繪製兩個圖形並將它們粘在一起。 爲了得到想要的結果,現在可以玩顯示的標記以及參數linthreshx。下面是一個例子。

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.ticker 
mu, sigma = 3., 1. # mean and standard deviation 
data = np.random.lognormal(mu, sigma, 1000) 

#Make CDF 
dataSorted = np.sort(data) 
dataCdf = np.linspace(0,1,len(dataSorted)) 

fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True) 
plt.subplots_adjust(wspace=0.00005) 
ax1.plot(dataCdf[:len(dataCdf)/2], dataSorted[:len(dataCdf)/2]) 
ax2.plot(dataCdf[len(dataCdf)/2:]-1, dataSorted[len(dataCdf)/2:]) 

ax1.set_yscale('log') 
ax2.set_yscale('log') 

ax1.set_xscale('symlog', linthreshx=0.001) 
ax2.set_xscale('symlog', linthreshx=0.001) 

ax1.set_xlim([0.01, 0.5]) 
ax2.set_xlim([-0.5, -0.01]) 

ticks = np.array([0.01,0.1, 0.3]) 
ticks2 = ((1-ticks)[::-1])-1 
ax1.set_xticks(ticks) 
ax1.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter()) 
ax2.set_xticks(ticks2) 
ax2.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter()) 
ax2.set_xticklabels(ticks2+1) 

ax1.spines["right"].set_visible(False) 
ax2.spines["left"].set_visible(False) 
ax1.yaxis.set_ticks_position('left') 
ax2.yaxis.set_ticks_position('right') 

ax1.set_xlabel('probability') 
ax1.set_ylabel('value') 

plt.savefig(__file__+".png") 
plt.show() 

enter image description here

+0

事實證明,這實際上並不是我正在尋找的。對數正態分佈在圖上應該顯示爲一條完美的直線。我對「對數最高爲0.5」和「反比」從0.5到1對數的解釋必須是錯誤的。 – hm8