Verfasst am: 27.03.2015, 10:23
Titel: einzelne Balken im Balkendiagramm beschriften
Hallo Leute,
ich habe ein Balkendiagramm vorliegen, von dem ich nun die einzelnen Balken beschriften möchte. Und zwar habe ich auf der x-Achse 47 Balken abgetragen, die aber nicht in der Reihenfolge 1....47 dort auftauchen, sondern in Reihenfolge einer vorher berechneten Reihenfolge, die order heißt.
Mein bisheriger Befehl sieht so aus - aber es tut sich nichts.
Wie kann ich das angleichen?
Code:
[SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment, 4,15);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters) bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
set(gca, 'XTickLabel', order) pause(0.5) end
[SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment, 4,15);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters) bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
str = 'order'
set(gca, 'XTickLabel', 1:numel(str)) pause(0.5) end
wenn ich das mit zufälligen Balken mache und dann meine x-Achse willkürlich mit set(gca, 'XTickLabel', order)
beschrifte funktioniert es.
Wie groß ist bei dir denn der Wert length(SetOfClusters)? wird die for-Schleife, in der die Achse umbenannt wird wirklich aufgerufen?
Wie kommen denn die Werte in
nein, es handelt sich hierbei um eine fertige Funktion. Da ich aber vorher ein paar Sachen selbst ausprobiert habe, ist es letztendlich Cluster_optics3 geworden. Ich kopiere den Code mal hier rein:
% -------------------------------------------------------------------------------------------
% Diese Funktion greift auf obigen Algorithmus von Ankerst, Mihael, et al. Zurück
% ----------------------------------------------------------------------------------
% Written by Alex Kendall
% University of Cambridge
% 18 Feb 2015
% http://mi.eng.cam.ac.uk/~agk34/
% This software is licensed under GPLv3, see included glpv3.txt.
% -------------------------------------------------------------------------------------------
% Input:
% points - Beispielsortiment, welches geclustert werden soll
% Die Artikel bilden die einzelnen Zeilen und die Spalten sind
% die Datendimensionen
% minpts - Anzahl der Mindestartikel in einem Cluster
% epsilon - Schwelle, um ein Cluster zu bilden
% -------------------------------------------------------------------------------------------
% Output:
% SetOfClusters - gibt Start- und Endindizes der einzelnen Cluster an
% RD - Erreichbarkeitsdistanz von jedem Artikel
% CD - Kerndistanz von jedem Artikel
% order - Reihenfolge der Punkte im Erreichbarkeitsgraphen
% -------------------------------------------------------------------------------------------
% Dependencies:
% This function requires optics.m from Michal Daszykowski's implementation of calculating the
% reachability distance for all points. For more details, refer to
% http://chemometria.us.edu.pl/index.php?goto=downloads
disp('Calculating reachability for all points.');
29 tic;
30
31 [RD,CD,order]=optics(points,minpts);
32 toc;
33
41 while i < size(points,1)-1
42 mib = max([mib, RD(order(i))]);
43 if RD(order(i))*(1-epsilon) >= RD(order(i+1))
44 % update mib values and filter down areas
45 for k=2:size(SetOfSteepDownAreas,2)
46 SetOfSteepDownAreas(k).mib = max(RD(order((SetOfSteepDownAreas(k).end+1):i)));
47 end
48 k=2;
49 while k<=size(SetOfSteepDownAreas,2)
50 if RD(order(SetOfSteepDownAreas(k).start))*(1-epsilon) < mib
51 if k==size(SetOfSteepDownAreas,2)
52 SetOfSteepDownAreas = SetOfSteepDownAreas(1:k-1);
53 else
54 SetOfSteepDownAreas = SetOfSteepDownAreas([1:k-1, k+1:size(SetOfSteepDownAreas,2)]);
55 end
56 else
57 k = k+1;
58 end
59 end
60
61 newD = size(SetOfSteepDownAreas,2)+1;
62 SetOfSteepDownAreas(newD).start = i;
63 SetOfSteepDownAreas(newD).mib = 0;
64
65 % find end of downward area
66 while i < size(points,1)-1
67 if RD(order(i))*(1-epsilon) >= RD(order(i+1))
68 i = i+1;
69 else
70 j = i;
71 while j < size(points,1)-1
72 if or(j-i>minpts, RD(order(j)) < RD(order(j+1)))
73 % if the downward area that isn't steep is longer than minpts, or no longer downward
74 j=-1;
75 break;
76 elseif RD(order(j))*(1-epsilon) >= RD(order(j+1))
77 % if it is a steepdownward area
78 break;
79 else
80 j = j+1;
81 end
82 end
83
84 if or(j == -1, j == size(points,1)-1)
85 % end of downward area
86 break;
87 else
88 i = j;
89 end
90 end
91 end
92
93 SetOfSteepDownAreas(newD).end = i-1;
94 mib = RD(order(i));
95
96 elseif RD(order(i)) <= RD(order(i+1))*(1-epsilon)
97 % Up area
98 upAreaStart = i;
99 % update mib values and filter down areas
100 for k=2:size(SetOfSteepDownAreas,2)
101 SetOfSteepDownAreas(k).mib = max(RD(order(SetOfSteepDownAreas(k).end:i)));
102 end
103 k=2;
104 while k<=size(SetOfSteepDownAreas,2)
105 if RD(order(SetOfSteepDownAreas(k).start))*(1-epsilon) < mib
106 if k==size(SetOfSteepDownAreas,2)
107 SetOfSteepDownAreas = SetOfSteepDownAreas(1:k-1);
108 else
109 SetOfSteepDownAreas = SetOfSteepDownAreas([1:k-1, k+1:size(SetOfSteepDownAreas,2)]);
110 end
111 else
112 k = k+1;
113 end
114 end
115
116
117 % find end of upward area
118 while i < size(points,1)-1
119 if RD(order(i)) <= RD(order(i+1))*(1-epsilon)
120 i = i+1;
121 else
122 j = i;
123 while j < size(points,1)-1
124 if or(j-i>minpts, RD(order(j)) > RD(order(j+1)))
125 % if the upward area that isn't steep is longer than minpts, or no longer upward
126 j=-1;
127 break;
128 elseif RD(order(j)) <= RD(order(j+1))*(1-epsilon)
129 % if it is a steepdownward area
130 break;
131 else
132 j = j+1;
133 end
134 end
135
136 if or(j == -1, j== size(points,1)-1)
137 % end of downward area
138 break;
139 else
140 i = j;
141 end
142 end
143 end
144
145 mib = RD(order(i));
146
147 for k=2:size(SetOfSteepDownAreas,2)
148 if RD(order(i))*(1-epsilon) > SetOfSteepDownAreas(k).mib
149 if and(RD(order(SetOfSteepDownAreas(k).start)) >= RD(upAreaStart) , RD(order(SetOfSteepDownAreas(k).end)) <= RD(order(i)))
150 if abs(RD(order(SetOfSteepDownAreas(k).start))-RD(order(i))) <= epsilon*max(RD(order(SetOfSteepDownAreas(k).start)),RD(order(i)))
151 % condition a
152 clusterStart = SetOfSteepDownAreas(k).start;
153 clusterEnd = i;
154 elseif RD(order(SetOfSteepDownAreas(k).start))*(1-epsilon) > RD(order(i))
155 % condition b
156 tmp = abs(RD(SetOfSteepDownAreas(k).start:SetOfSteepDownAreas(k).end)-RD(order(i)));
157 [~, clusterStart] = min(tmp); %index of closest value
158 clusterStart = clusterStart+SetOfSteepDownAreas(k).start-1;
159 clusterEnd = i;
160 elseif RD(order(SetOfSteepDownAreas(k).start)) < RD(order(i))*(1-epsilon)
161 % condition c
162 clusterStart = SetOfSteepDownAreas(k).start;
163 tmp = abs(RD(upAreaStart:i)-RD(order(SetOfSteepDownAreas(k).start)));
164 [~, clusterEnd] = min(tmp); %index of closest value
165 clusterEnd = clusterEnd+upAreaStart;
166 else
167 error('ERROR\n');
168 end
169
170 if abs(clusterEnd - clusterStart) >= minpts
171 newD = size(SetOfClusters,2)+1;
172 SetOfClusters(newD).start = clusterStart;
173 SetOfClusters(newD).end = clusterEnd;
174 end
175 end
176 end
177 end
178
179 else
180 i = i+1;
181 end
182 end
183
Und wenn ich mir das mit folgendem Befehl zeichnen lasse, dann erhalte ich beigefügtes Bild. Allerdings sind die Balken von 1 - 47 chronologisch nummeriert. Wenn ich aber nur Optics durchlaufen lasse (also die Funktion, auf die hier zurückgegriffen wird), dann sollen die in folgender Reihenfolge sein:
Bitte binde den Code doch mit den Code-Butons ein, das macht es deutlich übersichtlicher.
Und das hilft mir leider nicht wirklich weiter.
Die Funktion, auf die deine Kopie sich bezieht ist nämlich auch keine Standard-Funktion und sich jetzt, in diesem Fall, in zwei andere Funktionen so reinzuarbeiten wäre ein bisschen viel Aufwand.
Ich muss nur wissen, wie die Daten aufgebaut sind, die du reinsteckst und wie die Daten aussehen, die wieder rauskommen.
"Und wenn ich mir das mit folgendem Befehl zeichnen lasse..." welchen folgenden Befehl meinst du? Es folgt leider keiner.
An sich dürfte das aber alles keine Auswirkung auf den Plot haben.
Versuchs mal, indem du deine x-Achse mit XTicks in entsprechend viele Teilstücke aufteilst:
[SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment, 2,25);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters) bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
pause(0.5) end
Deine Codes haben leider nicht geholfen Ich habe beide Varianten nach pause(0.5) reinkopiert. Trotzdem danke für deine Hilfe!
Der Graph wird immer noch so angezeigt, als wenn Artikel 47 der letzte Balken ist. Aber das ist ja 44.
Das sind übrigens die In- und Outputs der Funktion:
% Input:
% points - Beispielsortiment, welches geclustert werden soll
% Die Artikel bilden die einzelnen Zeilen und die Spalten sind
% die Datendimensionen
% minpts - Anzahl der Mindestartikel in einem Cluster
% epsilon - Schwelle, um ein Cluster zu bilden
% -------------------------------------------------------------------------------------------
% Output:
% SetOfClusters - gibt Start- und Endindizes der einzelnen Cluster an
% RD - Erreichbarkeitsdistanz von jedem Artikel
% CD - Kerndistanz von jedem Artikel
% order - Reihenfolge der Punkte im Erreichbarkeitsgraphen
Wenn ich nur Optics aufrufe, erhalte ich: RD, CD und order
Wenn ich cluster_optics aufrufe, dann erhalte ich:
cluster_optics3(Beispielsortiment, 2, 25)
Calculating reachability for all points.
Elapsed time is 0.003259 seconds.
Computing clusters.
Elapsed time is 0.000490 seconds.
ans =
1x0 struct array with no fields.
Ich sehe aber doch am Graphen, dass da was rauskommen muss.
dann bekomme ich folgenden graphen:
bei mir funktioniert es also, ich kann mir nicht erklären, wieso bei dir nicht...hat dein order vielleicht eine andere Datenstruktur?
An welche Stelle schreibst du das denn hin? Ich habe das so eingetippt:
Code:
[SetOfClusters, RD, CD, order] = cluster_optics3(Beispielsortiment, 2,25);
bar(RD(order));
figure;
%Cycle through all clusters
for i = 2:length(SetOfClusters) bar(RD(order(SetOfClusters(i).start:SetOfCluster(i).end)));
pause(0.5) set(gca,'XTick', 1:47,'XTicklabel',order) end
ich habe es einfach in die kommandozeile getippt.
Aber dann ist ja jetzt alles gut ;-)
Dann war die figure wohl zum Zeitpunkt des Befehls nicht mehr aktiv.
Kein Problem, freut mich, wenn ich dir helfen konnte ;-)
und ich wollte ja dann auch wissen, wieso es bei dir nicht funktioniert und bei mir schon.
Einstellungen und Berechtigungen
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
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.