WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Iteratives plotten und Colorbar

 

Joa
Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 22.10.2015, 14:02     Titel: Iteratives plotten und Colorbar
  Antworten mit Zitat      
Hallo zusammen,

ich komme momentan leider nicht weiter und bin für jeden Vorschlag dankbar.

Ich habe mir diesen Code

http://www.mathworks.com/matlabcent.....45698-correlation-circles
geholt und ein kleines bisschen verändert.

Nun möchte ich gerne rechts neben dem eigentlichen Plot die dazugehörige colorbar beschriftet anzeigen lassen.

Ich komme einfach nicht darauf wie ich das sauber hinbekomme.

Hier nochmal mein Testcode:
Code:

function korrelationsplot
data = [0.166 0.739 0.776 0.503 0.572;...
    0.169 0.516 0.720 0.616 0.6053;...
    0.171 0.529 0.751 0.546 0.631;...
    0.166 0.522 0.710 0.736 0.679;...
    0.171 0.630 0.650 0.482 0.886;...
    0.166 0.653 0.689 0.438 0.890;...
    0.167 0.646 0.708 0.514 0.799;...
    0.174 0.760 0.767 0.619 0.711;...
    0.175 0.470 0.728 0.628 0.767;...
    0.172 0.595 0.672 0.735 0.548;...
    0.176 0.520 0.845 0.487 0.727;...
    0.175 0.832 0.736 0.384 0.859;...
    0.169 0.744 0.631 0.742 0.761;...
    0.170 0.600 0.781 0.532 0.521;...
    0.171 0.596 0.664 0.490 0.734;...
    0.177 0.629 0.720 0.564 0.744];
list = {'A','B','C','D','E'};

% Korrelationskreise anzeigen lassen
h = korrelation(data,'varNames',list);

function h = korr(data, varargin)
%CORRELATIONCIRCLES Represent correlation matrix using colored circles
% ------
% Author: David Legland
% e-mail: david.legland@grignon.inra.fr
% Created: 2012-07-16,    using Matlab 7.9.0.529 (R2009b)
% Copyright 2012 INRA - Cepia Software Platform.


%% Eingabeparameter

varNames = {};
while length(varargin) >= 2
    argName = varargin{1};
    switch lower(argName)
        case 'varnames'
            varNames = varargin{2};
        otherwise
            error(['Unkown optional argument: ' argName]);
    end
    varargin(1:2) = [];
end


%% Initialisation

% Anzahl der Variablen
n = size(data, 2);
nRows = n;
nCols = n;

% Berechnet die Korrelationsmatrix des Inputs
% Die Werte werden benötigt um den Radius und die Farbe der Kreise zu berechnen
cc = corrcoef(data);


%% Anzeige

% Colormap erstellen
cmap = winter(256);

% Bildet die Hauptachse, die alle kleinen Achsen enthält
figure('units','normalized','outerposition',[0 0 1 1],'Color',[1 1 1]);
cax = gca;
axRef = newplot(cax);
fig = ancestor(axRef, 'figure');
holdState = ishold(axRef);
set(axRef,'Visible','off','xlim',[-1 1],'ylim',[-1 1],'DataAspectRatio',[1 1 1],'PlotBoxAspectRatio',[1 1 1]);

pos = get(axRef, 'Position');

% Größe der Subplots
width   = pos(3) / (nRows+1);
height  = pos(4) / (nCols+1);

% 2 Prozent Platz zwischen den Achsen
space = .02;
pos(1:2) = pos(1:2) + space * [width height];

% Referenzachse
axRefVisibility = get(axRef, 'HandleVisibility');
axRefParent = get(axRef, 'Parent');

% Daten um die Kreise zu plotten
t = linspace(0, 2*pi, 100)';
cx = cos(t);
cy = sin(t);


%% Alle Kreise plotten

% Iteration über alle Zellen
for i = nRows:-1:1
    for j = nCols:-1:1
       
        % Berechnet die Position in der Hauptfigure
        % (nötig um x und y abhängig von der Zellennummer zu ermitteln...)
        axPos = [...
            pos(1) + j * width  ...
            pos(2) + (nRows-i) * height ...
            width * (1-space) ...
            height * (1-space)];
       
        % Achse erstellen
        ax(i,j) = axes('Position', axPos,'HandleVisibility', axRefVisibility,'Parent', axRefParent);
       
        % Farbe und Radius der Kreise, sowie Lage der Kreise
        indColor = min(floor((cc(i,j) + 1) * 128) + 1, 256);
        color = cmap(indColor, :);
        r = abs(cc(i, j));
       
        % Kreise ausfüllen
        hh(i,j) = fill(cx*r, cy*r, color);

        % Normalisiert die Anzeiche der Achse
        set(ax(i,j),'xlim', [-1 1],'ylim', [-1 1],'DataAspectRatio', [1 1 1], ...
            'xgrid', 'off','ygrid', 'off','Visible', 'off');
    end
end


%% Display

% Entfernt alle Labels
set(ax(:), 'xticklabel', '')
set(ax(:), 'yticklabel', '')

% Tags
set(axRef, 'userdata', ax, 'tag', 'CorrelationCirclesRefAxis');
set(ax, 'tag', 'CorrelationCirclesAxis');

% axRef zur aktuellen Achse machen
set(fig, 'CurrentAx', axRef)
if ~holdState,
    set(fig, 'NextPlot', 'replace')
end

% Titel und Label sichtbar machen
textHandles = [get(axRef,'Title'); get(axRef,'XLabel'); get(axRef,'YLabel')];
set(textHandles, 'String', '', 'Visible', 'on')

% Zeigt die Labels der Achsen an
if ~isempty(varNames)
    % Eventuell in Cellarray umwandeln
    if ischar(varNames)
        varNames = cellstr(varNames);
    end
   
    % Variablennamen anzeigen
    for i = 1:n
        set(ax(1,i), 'XAxisLocation', 'Top');xlabel(ax(1, i), varNames{i}, ...
            'Visible', 'On','FontSize', 8, 'Rotation', 90,'VerticalAlignment', 'Middle', ...
            'HorizontalAlignment', 'Left');
        ylabel(ax(i, 1), varNames{i},'Visible', 'On','FontSize', 8, 'Rotation', 0, ...
            'VerticalAlignment', 'Middle','HorizontalAlignment', 'Right');
    end
end

% Handles zurück geben, wenn benötigt
if nargout ~= 0
    h = hh;
end
 


Im Prinzip muss man ja eine zusätzliche Spalte erstellen und darin die Colorbar anzeigen lassen. Allerdings weiß ich nicht wie genau ich das angehen kann.

Oder habe ich irgendwo einen Denkfehler und es gibt eine einfachere Lösung?

Ich bin für jede Hilfe dankbar.

Viele Grüße und vielen Dank im Voraus
Joa
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.10.2015, 21:38     Titel: Re: Iteratives plotten und Colorbar
  Antworten mit Zitat      
Hallo Joa,

Hast Du es mal einfach mit dem Befehl colorbar versucht? Der schiebt nämlich die anderen AXES zur Seite, oder?

Der gepostete Code ist ziemlich umfangreich dafür, dass Du damit eigentlich gar keine Probleme hast.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Themenstarter

Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 23.10.2015, 05:37     Titel:
  Antworten mit Zitat      
Klar habe ich es mit Colorbar probiert. Allerdings wird die Colorbar dann in das erste Kästchen oben links geplotten, da der Plot ja iterativ erfolgt. Und genau da liegt ja mein Problem.
Ich möchte eine Colorbar für alle Kästchen/ Kreise rechts in der Figure haben.
Ich hatte schon probiert mit subplot zuarbeiten, da war allerdings dann das Problem das die Kästchen mit den Kreisen trotzdem über die ganze Figure geplottet wurden. Das liegt ja dann an der Berechnung im Code, wie die Kästchen verteilt werden müssen.

Also wäre es super wenn noch jemand eine Idee hätte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.10.2015, 08:23     Titel:
  Antworten mit Zitat      
Hallo Joa,

Du hast diese Grafik nun wirklich so kompliziert gemacht, wie es möglich ist. Wieso erstellst Du für jeden Kreis ein eigenes AXES Objekt? Es wäre viel einfacher, die Kreise in ein einzelnes AXES zu zeichnen. Und dann würde auch COLORBAR direkt und ohne irgendwelche Tricks funktionieren.

Versuche es mal.

Der Code lässt sich auch ansonsten deutlich vereinfachen:
Code:
figure('units','normalized','outerposition',[0 0 1 1],'Color',[1 1 1]);
cax = gca;
axRef = newplot(cax);
fig = ancestor(axRef, 'figure');
holdState = ishold(axRef);
set(axRef,'Visible','off','xlim',[-1 1],'ylim',[-1 1],'DataAspectRatio',[1 1 1],'PlotBoxAspectRatio',[1 1 1]);

zu:
Code:
fig = figure('units','normalized','outerposition',[0 0 1 1],'Color',[1 1 1]);
axRef = axes('Visible','off','xlim',[-1 1],'ylim',[-1 1],'DataAspectRatio',[1 1 1],'PlotBoxAspectRatio',[1 1 1], 'NextPlot', 'add');

Das Setzen der HandleVisibility ist überflüssig. Und "korr" soll bestimmt "korrelation" heißen, damit der Code läuft.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Themenstarter

Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 23.10.2015, 12:04     Titel:
  Antworten mit Zitat      
Danke für deine Antwort!

Ich habe es jetzt umgebaut.
Code:

clear all;
close all;

data = [0.166 0.739 0.776 0.503 0.572;...
    0.169 0.516 0.720 0.616 0.6053;...
    0.171 0.529 0.751 0.546 0.631;...
    0.166 0.522 0.710 0.736 0.679;...
    0.171 0.630 0.650 0.482 0.886;...
    0.166 0.653 0.689 0.438 0.890;...
    0.167 0.646 0.708 0.514 0.799;...
    0.174 0.760 0.767 0.619 0.711;...
    0.175 0.470 0.728 0.628 0.767;...
    0.172 0.595 0.672 0.735 0.548;...
    0.176 0.520 0.845 0.487 0.727;...
    0.175 0.832 0.736 0.384 0.859;...
    0.169 0.744 0.631 0.742 0.761;...
    0.170 0.600 0.781 0.532 0.521;...
    0.171 0.596 0.664 0.490 0.734;...
    0.177 0.629 0.720 0.564 0.744];
list = {'A','B','C','D','E'};

% Anzahl der Variablen
n = size(data, 2);

% Berechnet die Korrelationsmatrix des Inputs
% Die Werte werden benötigt um den Radius und die Farbe der Kreise zu berechnen
cc = corrcoef(data);

% Colormap erstellen
cmap = winter(265);

% Daten um die Kreise zu plotten
t = linspace(0, 2*pi, 100)';
cx = cos(t);
cy = sin(t);

% Bildet die Hauptachse, die alle kleinen Achsen enthält
fig = figure('units','normalized','outerposition',[0 0 1 1],'Color',[1 1 1]);

pos = get(fig, 'Position');

% Größe der Einzelnen Plots
width   = pos(3) / n;
height  = pos(4) / n;

% 2 Prozent Platz zwischen den Achsen
space = .02;
pos(1:2) = pos(1:2) + space * [width height];

for i=1:n
    for j=1:n
        % Berechnen der Mittelpunkte der Kreise
        xp(i,j)=i;
        yp(i,j)=j;
       
        % Radius der Kreise berechnen
        r = (abs(cc(i,j))/2);
       
        % Farbe und Radius der Kreise, sowie Lage der Kreise
        indColor = min(floor((cc(i,j) + 1) * 128) + 1, 256);
        color = cmap(indColor,:);        
       
        hold on;
        hh(i,j) = fill(cx*r+xp(i,j), cy*r+yp(i,j), color);
    end
end
colorbar;

% Achsenbeschriftung hinzufügen
leer = {''};
VarNames=[leer list leer];
sz = size(list,2)+1;
set(gca,'xlim',[0 sz]);
set(gca,'ylim',[0 sz]);
set(gca,'XTickLabel',VarNames);
set(gca,'YTickLabel',VarNames);

 




Fnktioniert auch so. Allerdings ist mir noch nicht ganz klar wie ich die colorbar dazu bekomme meine Farben wie auch meine Skalierung anzugzeigen.

Und gibt es irgendeine Möglichkeit das er die Kreise immer rund darstellt und nicht so verzieht?

Hast dazu vielleicht noch jemand eine Hlfestellung?

Danke schon mal!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 23.10.2015, 12:14     Titel:
  Antworten mit Zitat      
Zitat:
Und gibt es irgendeine Möglichkeit das er die Kreise immer rund darstellt und nicht so verzieht?
wenn kreise nicht rund sind liegt das meist daran das die achsen unterschiedlich skaliert sind.
Code:

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Joa
Themenstarter

Forum-Century

Forum-Century


Beiträge: 133
Anmeldedatum: 19.05.09
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 23.10.2015, 12:19     Titel:
  Antworten mit Zitat      
Danke, das macht Sinn Smile

Jetzt brauche ich "nur" noch eine richtig skalierte Colorbar.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.