2016-11-27 1 views
1

Kann nicht herausfinden, wie einfach Colorbar zu einer Matrix von hexbinmatplotlib Plots hinzuzufügen. Es ist eine 7 von 7 Matrix von Plots, hier ist ein Teil des Codes für die erste Reihe:Matplotlib Hexbin hinzufügen Farbbalken - für Dummies

#importing nec. libs 
import pandas as pd 
from pylab import rcParams 
from matplotlib import pyplot as PLT 
%matplotlib inline 

#reading data 
dataset_cat_coded_path = 'C:/Users/IBM_ADMIN/Documents/Sberbank/dataset_cat_coded.csv' 
dataset_cat_coded = pd.read_csv(dataset_cat_coded_path, encoding = 'cp1251') 
test_frame = dataset_cat_coded[['opf','priority', 'sales_method_id', 'is_block_vks','sector_id', 'segment_id', 'org_type_id']] 



#building figure 
rcParams['figure.figsize']=30,30 #fig. size 

#fig. initiation 
fig = PLT.figure() 

#setting parameters defining min and max luminance 
vmin = 0 
vmax=test_frame.shape[0] 

#building a row of plots 
ax1 = fig.add_subplot(7,7,2) 
ax1.hexbin(test_frame.opf, test_frame.priority,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax1.set_title('priority') 
ax1.set_ylabel('OPF') 

ax2 = fig.add_subplot(7,7,3) 
ax2.hexbin(test_frame.opf, test_frame.sales_method_id,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax2.set_title('sales_method_id') 

ax3 = fig.add_subplot(7,7,4) 
ax3.hexbin(test_frame.opf, test_frame.is_block_vks,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax3.set_title('is_block_vks') 

ax4 = fig.add_subplot(7,7,5) 
ax4.hexbin(test_frame.opf, test_frame.sector_id,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax4.set_title('sector_id') 

ax5 = fig.add_subplot(7,7,6) 
ax5.hexbin(test_frame.opf, test_frame.segment_id,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax5.set_title('segment_id') 

ax6 = fig.add_subplot(7,7,7) 
ax6.hexbin(test_frame.opf, test_frame.org_type_id,C=None,gridsize=12,bins=None,mincnt=1, vmin = vmin, vmax=vmax) 
ax6.set_title('org_type_id') 

#colorbar attempt 
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) 
fig.colorbar(ax6, cax=cbar_ax, location='bottom') here 

Fehlertext:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-17-e885eb3cd39a> in <module>() 
    36 
    37 cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) 
---> 38 fig.colorbar(ax6, cax=cbar_ax, location='bottom') 

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\figure.py in colorbar(self, mappable, cax, ax, use_gridspec, **kw) 
    1591     cax, kw = cbar.make_axes(ax, **kw) 
    1592   cax.hold(True) 
-> 1593   cb = cbar.colorbar_factory(cax, mappable, **kw) 
    1594 
    1595   self.sca(current_ax) 

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\colorbar.py in colorbar_factory(cax, mappable, **kwargs) 
    1328   cb = ColorbarPatch(cax, mappable, **kwargs) 
    1329  else: 
-> 1330   cb = Colorbar(cax, mappable, **kwargs) 
    1331 
    1332  cid = mappable.callbacksSM.connect('changed', cb.on_mappable_changed) 

C:\Program Files\Anaconda3\lib\site-packages\matplotlib\colorbar.py in __init__(self, ax, mappable, **kw) 
    878   # Ensure the given mappable's norm has appropriate vmin and vmax set 
    879   # even if mappable.draw has not yet been called. 
--> 880   mappable.autoscale_None() 
    881 
    882   self.mappable = mappable 

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

Resultierendes Grundstück: enter image description here

+0

Es gibt Tonnen von Beispielen da draußen, also was hast du bisher versucht? Außerdem müssen Sie angeben, ob Sie der gesamten Figur eine Farbleiste hinzufügen möchten. Wenn ja, sind die Datenlimits für alle Zahlen gleich? Oder möchtest du eine Farbleiste pro Figur haben? – ImportanceOfBeingErnest

+0

Datenlimits sind gleich, also 1 Farbbalken für die ganze Figur. Um ehrlich zu sein, wenn ich es auch noch vor der Figur selbst machen könnte, wäre das auch ok. Problem ist, ich kann nicht verstehen, welche Argumente in meinem speziellen Fall zu plt.colorbar() übergeben werden, damit es funktioniert. –

+0

@ImportanceOfBeingErnest Lösung bilden die Seite, die Sie verwiesen haben 'cbar_ax = fig.add_axes ([0,85, 0,15, 0,05, 0,7]) fig.colorbar (im, cax = cbar_ax)' gibt Fehler * 'AxesSubplot 'object hat kein Attribut' autoscale_None '* –

Antwort

0

Als ich darauf hinwies, in Die Kommentare, this question zeigt, wie Sie eine Farbleiste hinzufügen.

In Ihrem Code

fig.colorbar(ax6, cax=cbar_ax, location='bottom') 

Sie versuchen, eine colorbar auf die Figur zu setzen, ohne Angabe auf welches Objekt sie beziehen sollte. Daher erhalten Sie einen Fehler, der Ihnen im Grunde sagt, dass Sie kein Objekt mit einem Mappable versehen haben.

Was Sie tun müssen, ist, Ihr Hexbin-Bild der Farbleiste zu geben, so dass es weiß, welche Farben tatsächlich gezeichnet werden sollen.

import numpy as np 
import matplotlib.pyplot as plt 

n = 1000 
x = np.random.standard_normal(n) 
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n) 

fig, axes = plt.subplots(nrows=2, ncols=2) 
for ax in axes.flat: 
    im = ax.hexbin(x,y) 

fig.subplots_adjust(right=0.8) 
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) 
fig.colorbar(im, cax=cbar_ax) 

plt.show() 
+0

Ja, vielen Dank für die Bereitstellung der endgültigen Antwort! Jetzt muss ich herausfinden, wie man die Größe ändern und es auf den Grund der ganzen Matrix von Plots bringen kann. –

+0

Die Zahlen hier 'fig.add_axes ([0.85, 0.15, 0.05, 0.7])' bestimmen die Position und Größe der Farbleiste. Die erste Zahl definiert, wo die linke Seite des Balkens auf der horizontalen Achse der ganzen Figur sein sollte, mit der Null in der linken unteren Ecke. Die zweite Zahl bestimmt das gleiche auf der vertikalen Achse. Wenn die Zahl [0,1, 0,1] ist, wird sich der Balken von der linken unteren Ecke aus erstrecken. Die 3. Zahl bestimmt die Länge des Farbbalkens in Bezug auf den Teil der Figur (= 0.5 -> Farbbalken streckt sich für die Hälfte der Figur). Die letzte Zahl bestimmt die Breite in den gleichen Begriffen. –

+0

Tatsächlich nimmt ['add_axes (rect)'] (http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.add_axes) ein Rechteck als Eingabe, wobei 'rect = [links, unten, Breite , Höhe] '. Diese Zahlen sind in Einheiten des Zahlenkoordinatensystems (von "0,0" in der unteren linken Ecke bis zu "1,1" in der oberen rechten Ecke). – ImportanceOfBeingErnest