2016-04-08 19 views
0

kullanılarak 1D çubuk grafiklerle yanlış hizalanır. Bir olayın meydana gelmesi üzerine iki değişkenin etkisini görselleştirmek için matplotlib kullanarak 2d histogramı çizmek istiyorum.Olayların 2D histogramı, olay olasılığı x ve y eksenleri python ve matplotlib

Test durumumda, olay “gerçekleşme dileği” dir ve x değişkeni düşen yıldız sayısıdır ve y bir peri vaftizcisinin katılımıdır. Yapmak istediğim şey, düşen yıldızların ve peri tanrıçalarının çöp kutuları için gerçek olan 2d'lik bir histogram grafiğini çizmektir. Sonra her bir eksenin yanında, düşen her yıldız ve peri godmothers (her bir histogram kutusu için olasılıkları içeren 1D çubuk grafik) için olay/olay (olaysız) gerçek olma olasılığını göstermek istiyorum. Çubuk grafik kutuları 2d histogram kutuları ile uyumlu olmalı ve hizalanmalıdır. Bununla birlikte, çubuk grafikler ve histogram kutuları arasında küçük bir yanlış hizalama var gibi görünüyor.

Çubuk grafiğin doğru şekilde hizalanması için, ilk ve son bölme kenarlarına karşılık gelen eksen sınırlarının ayarları hile yapar mı? Bu sınırlar ayarlandıktan sonra, bin merkezlerini plt.bar() dizinlerine dizinlerin aksine eksenler olarak besleyebilir miyim? aşağıdaki gibi

Kodum ve elde edilen görüntülerdir: benim orijinal kod işlevsel iken

import numpy as np 
import matplotlib.pyplot as plt 
from numpy import linspace 
import cubehelix 

# Create random events and non-events 
x_noneve = 3.*np.random.randn(10000) +22. 
np.random.seed(seed=41) 

y_noneve = np.random.randn(10000) 
np.random.seed(seed=45) 

x_eve = 3.*np.random.randn(1000) +22. 
np.random.seed(seed=33) 

y_eve = np.random.randn(1000) 

x_all = np.concatenate((x_eve,x_noneve),axis=0) 
y_all = np.concatenate((y_eve,y_noneve),axis=0) 

# Set up default x and y limits 
xlims = [min(x_all),max(x_all)] 
ylims = [min(y_all),max(y_all)] 

# Set up your x and y labels 
xlabel = 'Falling Star' 
ylabel = 'Fairy Godmother' 

# Define the locations for the axes 
left, width = 0.12, 0.55 
bottom, height = 0.12, 0.55 
bottom_h = left_h = left+width+0.03 

# Set up the geometry of the three plots 
rect_wishes = [left, bottom, width, height] # dimensions of wish plot 
rect_histx = [left, bottom_h, width, 0.25] # dimensions of x-histogram 
rect_histy = [left_h, bottom, 0.25, height] # dimensions of y-histogram 

# Set up the size of the figure 
fig = plt.figure(1, figsize=(9.5,9)) 
fig.suptitle('Wishes coming true', fontsize=18, fontweight='bold') 

cx1 = cubehelix.cmap(startHue=240,endHue=-300,minSat=1,maxSat=2.5,minLight=.3,maxLight=.8,gamma=.9) 

# Make the three plots 
axWishes = plt.axes(rect_wishes) # wishes plot 
axStarx = plt.axes(rect_histx) # x bar chart 
axFairy = plt.axes(rect_histy) # y bar chart 

# Define the number of bins 
nxbins = 50 
nybins = 50 
nbins = 100 

xbins = linspace(start = xlims[0], stop = xlims[1], num = nxbins) 
ybins = linspace(start = ylims[0], stop = ylims[1], num = nybins) 
xcenter = (xbins[0:-1]+xbins[1:])/2.0 
ycenter = (ybins[0:-1]+ybins[1:])/2.0 

delx = np.around(xbins[1]-xbins[0], decimals=2,out=None) 
dely = np.around(ybins[1]-ybins[0], decimals=2,out=None) 

H, xedges,yedges = np.histogram2d(y_eve,x_eve,bins=(ybins,xbins)) 
X = xcenter 
Y = ycenter 
H = np.where(H==0,np.nan,H) # Remove 0's from plot 

# Plot the 2D histogram 
cax = (axWishes.imshow(H, extent=[xlims[0],xlims[1],ylims[0],ylims[1]], 
     interpolation='nearest', origin='lower',aspect="auto",cmap=cx1)) 

#Plot the axes labels 
axWishes.set_xlabel(xlabel,fontsize=14) 
axWishes.set_ylabel(ylabel,fontsize=14) 

#Set up the plot limits 
axWishes.set_xlim(xlims) 
axWishes.set_ylim(ylims) 

#Set up the probability bins 
x_eve_hist, xoutbins = np.histogram(x_eve, bins=xbins) 
y_eve_hist, youtbins = np.histogram(y_eve, bins=ybins) 

x_noneve_hist, xoutbins = np.histogram(x_noneve, bins=xbins) 
y_noneve_hist, youtbins = np.histogram(y_noneve, bins=ybins) 

probax = [eve/(eve+noneve+0.0) if eve+noneve>0 else 0 for eve,noneve in zip(x_eve_hist,x_noneve_hist)] 
probay = [eve/(eve+noneve+0.0) if eve+noneve>0 else 0 for eve,noneve in zip(y_eve_hist,y_noneve_hist)] 

probax = probax/np.sum(probax) 
probay = probay/np.sum(probay) 

probax = np.round(probax*100., decimals=0, out=None) 
probay = np.round(probay*100., decimals=0, out=None) 

#Plot the bar charts 

#Set up the limits 
axStarx.set_xlim(xlims[0], xlims[1]) 
axFairy.set_ylim(ylims[0], ylims[1]) 

axStarx.bar(xcenter, probax, align='center', width =delx, color = 'royalblue') 
axFairy.barh(ycenter,probay,align='center', height=dely, color = 'mediumorchid') 

#Show the plot 
plt.show() 

resulting image

hex version

+0

Merhaba ve hoş geldiniz. Kodunuzda * sorun var mı? İşe yaramış gibi görünüyor, neyin daha iyi ve neyin olmadığıyla ilgili insanların fikirlerini soruyorsunuz. Bu mutlaka ilgili olan şey değil. Bu arada çok güzel araziler;) –

+0

Teşekkürler :) ve SO'nın kötüye kullanımı için özür dilerim (yeni olduğumu görebildiğiniz gibi). Bu kodla ilgili temel sorunlar (i) çubuk grafik kutularının doğru hizalanmasını elde etmekti - xy ekseni sınırlarının ayarlanmasının ve ardından merkezlerin kullanılmasının çubuk grafik ile mükemmel hizalamaya neden olmasını sağlamak istedim. 2d histo ve (ii) imshow'un kullanımı. Bu kodun çok daha karmaşık bir versiyonunda, imshow'u “üst” ve “alt” olarak adlandırmayı denedim, ama her zaman baklavalarla karşılaştırıldığında ters çevrilmiş görünüyordu. Maalesef, daha karmaşık sürümü yayınlayamıyorum. – SpicyBaguette

+0

Bunu gördünüz mü: http://matplotlib.org/examples/pylab_examples/scatter_hist.html? –

cevap

0

, 2B bilim, hem de çubuk grafik sınırları tanımlı değil histogram kutuları kullanarak. Böylece, kutulardaki herhangi bir değişiklik, kötü hizalanmış bir grafikle sonuçlandı. Grafiğin sınırları her histogram kovaları sınırlarına uygun olduğundan emin olmak için, bir

axStarx.set_xlim(axWishes.get_xlim()) 
axFairy.set_ylim(axWishes.get_ylim()) 
için

cax = (axWishes.imshow(H, extent=[xbins[0],xbins[-1],ybins[0],ybins[-1]], 
     interpolation='nearest', origin='lower',aspect="auto",cmap=cx1)) 

ve

axStarx.set_xlim(xlims[0], xlims[1]) 
axFairy.set_ylim(ylims[0], ylims[1]) 

için

cax = (axWishes.imshow(H, extent=[xmin,xmax,ymin,ymax], 
     interpolation='nearest', origin='lower',aspect="auto",cmap=cx1)) 

değiştirildi

Bilgi için, çubuk grafik e kabul edebilir Çubuk konumları olarak eksen boyunca ither indeksleri veya değerler. Çubuklar, kategorik değişkenlere değil, kutulara karşılık geldiğinde, eksen sınırlarını ayarlamak ve çubuk genişliğini doğru olarak tanımlamak önemlidir. Bunlar histo ile otomatik olarak yapılır. Bununla birlikte, üye sayısı dışındaki bir değişkeni çöp kutusuyla araştırmak isterseniz, bir çubuk grafik kullanmanız ve sınırları el ile tanımlamanız gerekir.

İlgili konular