Soru sorgrafik datasına label ekleme
mehmetozdogan tarafından 5 yıl önce soruldu

Merhaba,
Elimde 2 ayrı nokta grubu verisi var (x,y,z şeklinde). Bunları k-means-clustering ile kümelendirip çizdirdim ve iki nokta grubu arasındaki min mesafeleri hesaplattım. 
bu noktaları sırasına gore etiketlemek istiyorum..
 
Kodum Şu şekilde;
x=xlsread('ping1.xlsx', 'A:A');
y=xlsread('ping1.xlsx', 'B:B');
z=xlsread('ping1.xlsx', 'C:C');
a=xlsread('ping2.xlsx', 'A:A');
b=xlsread('ping2.xlsx', 'B:B');
c=xlsread('ping2.xlsx', 'C:C');
xyz=[x y z];
abc=[a b c];
rng(1);
[idx1,C1] = kmeans(xyz,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[idx2,C2] = kmeans(abc,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b')
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r')
m=[C1(:,1) C1(:,2) C1(:,3)]
n=[C2(:,1) C2(:,2) C2(:,3)]
d = pdist2(m,n)
[mindist, idx] = min(d, [], 2);
for K = 1 : length(idx)
fprintf('m(%d,:)@(%f,%f,%f) <-> n(%d,:)@(%f,%f,%f) is distance %f\n', K, m(K,:), idx(K), n(idx(K),:), mindist(K));
end
 
Çıktım da şu şekilde;
m(1,:)@(2.307377,-9.474109,2176.994092) <-> n(56,:)@(2.290992,-9.478318,2176.981385) is distance 0.021158
m(2,:)@(-2.665247,-9.509813,2175.179836) <-> n(78,:)@(-2.604127,-9.516500,2175.234717) is distance 0.082416
m(3,:)@(1.938588,-9.341269,2175.164459) <-> n(2,:)@(1.934761,-9.333414,2175.158117) is distance 0.010796
m(4,:)@(-0.428525,-9.582331,2177.013545) <-> n(77,:)@(-0.465985,-9.597041,2177.017668) is distance 0.040455
m(5,:)@(-1.616256,-9.620964,2176.938217) <-> n(46,:)@(-1.576331,-9.621269,2176.947139) is distance 0.040911
m(6,:)@(-0.749726,-9.431995,2175.113013) <-> n(58,:)@(-0.785440,-9.427461,2175.085079) is distance 0.045568
m(7,:)@(-1.141970,-9.584293,2176.986975) <-> n(86,:)@(-1.164590,-9.604803,2176.984763) is distance 0.030614
m(8,:)@(-1.749833,-9.470245,2175.137265) <-> n(84,:)@(-1.788894,-9.474396,2175.151150) is distance 0.041663
.
.
.
 
Grafikte noktaların üzerine  m1, m2, m3 ve n1, n2, n3 şeklinde etiket eklemek istiyorum..Hatta mümkünse distanceleri de yazdırabilirsem çok faydalı olur
 
Birkaç birşey denedim ama beceremedim..
 
Teşekkürler..
 

9 Cevap
En iyi cevap
ktu tarafından 5 yıl önce cevaplandı

 
Öncelikle çok sayıda veriniz olduğu için isimler birbirine karışabilir. Bunun için text kısmında ki x, y ve z yerlerine (mesela C(:,1)+0.02 yazdım) ekleyebilirsiniz.
İsimleri kendimce birden yüze kadar verdim. Kod bu şekilde çalışıyor.Bunu referans alarak arzu ettiğiniz güncellemeler yapabilirsiniz.
 
for i=1:100
m(i)=i
end
m=m';
for i=1:100
n(i)=i;
end
n=n';
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b');grid on;
text(C1(:,1)+0.02,C1(:,2),C1(:,3),num2str(m),'FontSize',5)
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r');grid on;
text(C2(:,1),C2(:,2),C2(:,3),num2str(n),'FontSize',5)

ktu tarafından 5 yıl önce cevaplandı

Merhaba,
Sorunuzu yanlış anlamadıysam nokta numaralarını "text" fonksiyonu ile yazdırabilirsiniz.
Mesafelere gelince noktaların mesafelerini işlem ile bulup bunları bir matrise atayarak yine "text" fonksiyonu kullanarak yazdırabilirsiniz, text'i kullanırken mesafeler sayı olacağı için num2str fonksiyonu ile yazı formatına dönüştürebilirsiniz.
Arzu ederseniz ping1 ve ping2 dosyalarını paylaşın kendim de deneyebilirim

mehmetozdogan tarafından 5 yıl önce cevaplandı

Text fonksiyonu ile denedim ama koordinatları yazdırmıştım, sıralamayı yazdıramadım. 
Dosyaları aşağıdaki  linkten indirebilirsiniz,
Teşekkürler.
https://dosya.co/lqgip6239ie2/ping.rar.html
 

mehmetozdogan tarafından 5 yıl önce cevaplandı

Merhaba tekrar,
Yardımınız için teşekkürler, kodu ekleyip ilk çalıştırdığımda istediğim gibi sonuç aldım ancak daha sonra çalıştırdığımda noktaların yanında sıralama yanında koordinatlar da çıktı, tekrar çalıştırdım bu sefer sadece m noktalarını çizdirdi label hiç yoktu.Ve her çalıştırdığımda sırayla bu iki durum tekrar ediyor. Yazdığım kod aşağıdaki gibi oldu. Aşağıdaki kodda bir aksilik görebiliyor rmusunuz?
x=xlsread('king1.xlsx', 'A:A');
y=xlsread('king1.xlsx', 'B:B');
z=xlsread('king1.xlsx', 'C:C');
a=xlsread('king2.xlsx', 'A:A');
b=xlsread('king2.xlsx', 'B:B');
c=xlsread('king2.xlsx', 'C:C');
xyz=[x y z];
abc=[a b c];
rng(1);
[idx1,C1] = kmeans(xyz,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
[idx2,C2] = kmeans(abc,100,'distance','sqEuclidean','MaxIter',500, 'Replicates', 10);
for i=1:100
m(i)=i
end
m=m';
for i=1:100
n(i)=i;
end
n=n';
plot3(C1(:,1),C1(:,2),C1(:,3),'kx','color','b');grid on;
text(C1(:,1)+0.02,C1(:,2),C1(:,3),num2str(m),'FontSize',5)
hold on
plot3(C2(:,1),C2(:,2),C2(:,3),'k*','Color','r');grid on;
text(C2(:,1),C2(:,2),C2(:,3),num2str(n),'FontSize',5)
m=[C1(:,1) C1(:,2) C1(:,3)]
n=[C2(:,1) C2(:,2) C2(:,3)]
d = pdist2(m,n)
[mindist, idx] = min(d, [], 2);
for K = 1 : length(idx)
fprintf('m(%d,:)@(%f,%f,%f) <-> n(%d,:)@(%f,%f,%f) is distance %f\n', K, m(K,:), idx(K), n(idx(K),:), mindist(K));
end
 
 
 

ktu tarafından 5 yıl önce cevaplandı

Şöyle ki; m değişkeni isminde birçok değişken var ve dikkat ederseniz m ve n değişkenlerinin transpozesini alınıyoruz, tekrar çalıştırıldığında bu sonucu vermesi doğal. Tavsiyem aynı isimde hiç değişken olmasın. O zaman herhangi bir problem kalmaz

mehmetozdogan tarafından 5 yıl önce cevaplandı

Merhaba tekrar,
Öncelikle desteğiniz için teşekkürler, değişken isimlerinin hepsini değiştirdim bu seferde ikinci kere çalıştırdığımda her noktanın yanına 1den 100'e kadar sayı yazdırıyor. 3. defa çalıştırdığımda tekrar eski hale geliyor. Bu konuda fikriniz var mı?
Teşekkürler.. 

ktu tarafından 5 yıl önce cevaplandı

Sanırım m ve n'yi oluştururken 100 e kadar komut veriyoruz ordan kaynaklanıyor olabilir. Onun dışında bir fikrim maalesef yok.
Kolay gelsin… 

ktu tarafından 5 yıl önce cevaplandı

Matlab programında bir kodu ikinci defa çalıştırdığınızda önce ki çalıştırdığınızın sonuçları tanımlı olduğu için değişkenlerin değerleri üst üste binebilir. Bunun için de kod yazmaya başladığınızda mutlaka en başta clc;clear; komutlarını yazmalısınız. Bu sayede önce ki değerler silinir ve yeniden hesaplatılır. Sanırım ihtiyacınız olan tek şey en başa yazmanız gereken clc;clear; komutları

mehmetozdogan tarafından 5 yıl önce cevaplandı

Evet değişkenlerin üst üste binmesinden kaynaklanıyor onu fark etmiştim, clc;clear; komutları işe yaradı. Yardımlarınız için çok teşekkür ederim..
İyi çalışmalar dilerim..