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

Position von Text im Subplot

 

Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 14.10.2010, 18:45     Titel: Position von Text im Subplot
  Antworten mit Zitat      
Hallo,

ich komm gerade nicht weiter und wuerde mich freuen wenn mir jemand helfen koennte.

Folgendes Problem: Ich erstelle eine variable Anzahl von Subplots und lasse Sie darstellen. Zudem muessen bestimmte Werte mit in den Plots angezeigt werden, was ich mit dem text-Befehl realisiere. Das Problem ist nun, dass ja je nach Anxahl der Subplots die Groesse der Axes verschieden ist und ich nicht weiss wie ich mein Textfeld immer in der oberen rechten Ecke plazieren kann. Die Bestimmung der Koordinaten fuer das Textfeld soll natuerlich automatisch erfolgen.

Hier mal ein Minimalbeispiel zum besseren Verstaendnis:
Code:

alldata.string = 'test';
alldata.num = 100;

figure('Units','normalized','position',[0 0 1 1]);
subplot(3,4,1) % 12 Subplots
plot(-sin(-pi:0.1:pi));
hold on
text(0.64,0.83,sprintf('%s = %.1f ms\n%s%.f ms\n%s%.2f%%\n%s%.4f',alldata.string,alldata.num,...
            'Ref = ',alldata.num,'Error = ',alldata.num,'R^2 = ',alldata.num),'Units','normalized',...
            'BackgroundColor',[1 1 1],'EdgeColor',[0 0 0],'Fontsize',9);
       
figure('Units','normalized','position',[0 0 1 1]);
subplot(1,1,1) % 1 Subplot
plot(-sin(-pi:0.1:pi));
hold on
text(0.64,0.83,sprintf('%s = %.1f ms\n%s%.f ms\n%s%.2f%%\n%s%.4f',alldata.string,alldata.num,...
            'Ref = ',alldata.num,'Error = ',alldata.num,'R^2 = ',alldata.num),'Units','normalized',...
            'BackgroundColor',[1 1 1],'EdgeColor',[0 0 0],'Fontsize',9);
 


Wie schaffe ich es auch das Textfeld bei nur einem Subplot in die Ecke zu bekommen. Ein Sahnehaeubchen waere noch, wenn die Schriftgroesse je nach Axesgroesse auch mit automatisch angepasst wird. Ich habe schon mit dem Position tag der Subplots rumgespielt, aber leider keine Loesung fuer die automatische Bestimmung der Koordinaten bzw. einer passenden Schriftgroesse gefunden.

Vielen Dank fuer jegliche Hilfe

MFG

Sco
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: 14.10.2010, 19:46     Titel: Re: Position von Text im Subplot
  Antworten mit Zitat      
Hallo Sco,

ich habe es nicht genau verstanden.
Du möchtest einen Text in die rechte obere Ecke eines beliebigen AXES-Objektes schreiben, oder?
Code:

AxisH = axes;  % Oder subplot(x,y,z)
TextH = text(1, 1, 'Rechte obere Ecke', ...
  'Units', 'normalized', ...
  'VerticalAlignment', 'top', ...
  'HorizontalAlignment', 'right');
 

Man kann zwar nun auch die FontUnits auf 'normalized' stellen, dann ändert sich die FontSize automatisch, wenn man die Figure- oder Axes-Größe verändert. Das bringt aber nicht während der Erstellung des Textes.
Man kann aber manuell eine passende FontSize finden:
Code:

for FontSize = [14,12,10,9,8,7]
  set(TextH, 'FontSize', FontSize);
  ext = get(TextH, 'Extent');
  if ext(3) < 1
    break
  end
end
set(TextH, 'FontUnits', 'normalized');  % Für Resizing
 

Die Units des Text-Objekts sind ja auf 'normalized' gesetzt worden. Also bedeutet Extent(3) < 1, dass der gesamte Text in die AXES passt.

Aber vielleicht wolltest Du etwas anderes?

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

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.10.2010, 12:04     Titel:
  Antworten mit Zitat      
Hallo Jan,

erstmal vielen Dank fuer deine Hilfe, es geht definitiv schon in die richtige Richtung und ich koennte es notfalls auch direkt so wie du vorgeschlagen hasst verwenden.
Falls es jedoch moeglich waere, moechte ich den Text in der Textbox linksbuendig haben. Ausserdem waere es schoen wenn die Textbox nixht genau in der Ecke ist, sondern wie im 1. Beispiel ein wenig platz zwischen Textrand und Axesrand bleibt. Und hier kommt eben das Problem, wie ich den proportional gleichen Abstand (Textbox zu Axesrand) bei einem groesseren Axes Objekt (z.b. bei 1 Subplot statt 12) erreichen kann, Nehme ich die gleichen Koordinaten wie im ersten Beispiel, so haengt die Textbox natuerlich in der Mitte der Axes (siehe mein 2. Beispiel).

Bezueglich der Fontsize ist das wirklich eine clevere Idee, allerdings wirklich nur zu gebrauchen wenn die Box an den Raendern sein soll. Oftmals (nicht in diesem Beispiel) habe ich jedoch das Problem, dass ich z.B. Text an ganz speziellen Positionen (z.B. mittels 'regionprops' erkannten Mittelpunkten von Objekten) auf Bilder schreiben moechte, jedoch aufgrund der verschiedenen Groessen der Bilder die Fontsize mal zu gross und mal zu klein ist. Es muss doch irgendeine Moeglichkeit geben die Fontsize immer so automatisch anzupassen, dass sie abhaenig von der Bildgroesse eine ausreuchende Groesse hat??? (Dieses Problem tritt z.b auf wenn man ein Bild rotiert, dann ist es groesser als das Originalbild, oder eben einfach mit Bildern unterschiedlicher Groesse arbeitet)

Ich weiss, dass sind ne Menge fragen, die mich aber leider auch schon eine Weile beschaeftigen, da sie bei mir fast taeglich auftreten... Rolling Eyes

Nochmals vielen Dank fuer jegliche Hilfe im Vorraus.

MFG

Sco
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: 15.10.2010, 13:56     Titel:
  Antworten mit Zitat      
Hallo Sco,

Zitat:
Falls es jedoch moeglich waere, moechte ich den Text in der Textbox linksbuendig haben.

Nun, das sollte nicht so schwierig sein:
Code:
'HorizontalAlignment', 'right'  ==> 'HorizontalAlignment', 'left'


Zitat:
Ausserdem waere es schoen wenn die Textbox nixht genau in der Ecke ist, sondern wie im 1. Beispiel ein wenig platz zwischen Textrand und Axesrand bleibt.

Nun, das sollte nicht so schwierig sein:
Code:
text(1, 1, ...)  ==> text(0.05, 0.95, ...)


[quote]Und hier kommt eben das Problem, wie ich den proportional gleichen Abstand (Textbox zu Axesrand) bei einem groesseren Axes Objekt (z.b. bei 1 Subplot statt 12) erreichen kann, Nehme ich die gleichen Koordinaten wie im ersten Beispiel, so haengt die Textbox natuerlich in der Mitte der Axes (siehe mein 2. Beispiel).[quote]
Nein. Das Text-Objekt wurde mit 'units'='normlized' erstellt. Also die die Position relative zur Axes definiert: 0 heißt links oder unten, 1 heißt recht oder oben.

Zitat:
Bezueglich der Fontsize ist das wirklich eine clevere Idee, allerdings wirklich nur zu gebrauchen wenn die Box an den Raendern sein soll.

Du kannst ja eine beliebige Grenze für die horizontale Ausdehnung definieren - das muss ja nicht 1 sein!
Code:
if ext(3) < 1  ==>  if ext(3) < 0.5

Dann wird die Text-Größe auf die halbe Axes-Weite begrenzt, ganz unabhängig von der Position übrigens.

Zitat:
Oftmals (nicht in diesem Beispiel) habe ich jedoch das Problem, dass ich z.B. Text an ganz speziellen Positionen (z.B. mittels 'regionprops' erkannten Mittelpunkten von Objekten) auf Bilder schreiben moechte, jedoch aufgrund der verschiedenen Groessen der Bilder die Fontsize mal zu gross und mal zu klein ist.

Wie gesagt: Zunächst mit einer Schleife über get(Extent), set(FontSize) die Textgröße so lange verkleinern bis der gewünschte prozentuale Anteil der Ausdehnung des AXES-Objektes erreicht ist. Danach FontUnits auf 'normalized' setzen, damit beim Skalieren der AXES oder der ganzen FIGURE der Text mitskaliert wird. Das klappt übrigens auch für UICONTROLs.

Soweit ich das verstehe, sollte die von mir genannte Lösung also mit den kleinen Anpassungen (right->left; 0,0 -> 0.05, 0.95) Dein Problem lösen.

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

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.10.2010, 16:14     Titel:
  Antworten mit Zitat      
Hallo Jan,

nochmals dank fuer deine Muehen, aber entweder wir beide reden heute aneinander vorbei oder ich steh auf dem Schlauch.

Wie ich schon sagte moechte ich eine Textbox, welche immer (etwa) in der linken oberen Ecke ist, dabei jedoch NICHT ueber den Axesrand hinaus geht und wenn moeglich, automatisch die Schriftgroesse anpasst (jedoch OHNE ueber den Axesrand zu gehen--> bedarf wahrscheinlich erneuter Berechnung der x- und y Koordinaten).

Das 'HorizontalAlignment', 'right', war in dem Sinne nicht schlecht, da so meine Textbox nie ueber den Axesrand geht. Aender ich dies jedoch zu 'left', so ist dies der Fall--> sieht bescheiden aus. Mit 'right' gefaellt mir jedoch der Text absolut nicht, da er nunmal linksbuendig sein soll.

Zitat:

Nein. Das Text-Objekt wurde mit 'units'='normlized' erstellt. Also die die Position relative zur Axes definiert: 0 heißt links oder unten, 1 heißt recht oder oben.


Hier besteht folgendes Problem: Natuerlich ist die relative Position immer gleich wegen den normalisierten Units, ABER da die Textbox immer die gleiche Groesse hat, ist sie im 1. Beispiel schoen in der Ecke und im 2. Beispiel mitten im Bild. Also muesste man im 2. Beispiel entweder die Schriftgroesse so vergroessern, dass die Textbox bis an die Rander der Axes reicht ODER die gesamte 'kleine' Textbox in die obere linke Ecke schieben. Jedoch weiss ich nicht wie ich dafuer die korrekten x- und y Koordinaten automatisch bekomme.
Kopier doch einfach mal kurz mein Beispiel im 1. Post und fuehr es aus, dann weisst du was ich meinte, wenn es nicht klar geworden ist.

Zitat:

Ausserdem waere es schoen wenn die Textbox nicht genau in der Ecke ist, sondern wie im 1. Beispiel ein wenig platz zwischen Textrand und Axesrand bleibt.
Code:

text(1, 1, ...)  ==> text(0.95, 0.95, ...) % denke du meintest 0.95 und nicht 0.05
 


Dementsprechend ist dies natuerlich nicht so einfach moeglich, da in diesem Fall (ausser bei 'HorizontalAlignment', 'right') die Textbox ueber den Axesrand geht.

Mit der Schriftgroesse verhaelt es sich dann aehnlich, dein Vorschlag klappt zwar soweit, jedoch weiss ich nicht ob die Box nicht ueber die Axesraender hinaus geht.
Ich habe das Gefuehl mann muesste davor schon wissen wie gross die Axes und Textbox ist und dementsprechend die Schriftgroesse der Textbox sowie die 'dazugehoerigen' x- und y Koordinten berechenen. Ich krieg es aber einfach nicht hin bzw. hab nicht wirklich eine Idee dafuer, leider!

Jan, vielleicht hasst du ja noch eine Loesung oder unter Umstaenden irgendein anderer Forenmember.
Ich wuerde mich auf jeden Fall weiterhin ueber Vorschlaege und Hilfen freuen.

MFG

Sco
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: 15.10.2010, 19:16     Titel:
  Antworten mit Zitat      
Hallo Sco,

Matlab ist nun mal wegen der vielen Möglichkeiten nicht trivial. Da muss man schon mal ein wenig diskutieren, bevor ein Problem und eine Lösung konvergieren.

Zitat:
Wie ich schon sagte moechte ich eine Textbox, welche immer (etwa) in der linken oberen Ecke ist, dabei jedoch NICHT ueber den Axesrand hinaus geht und wenn moeglich, automatisch die Schriftgroesse anpasst (jedoch OHNE ueber den Axesrand zu gehen--> bedarf wahrscheinlich erneuter Berechnung der x- und y Koordinaten).


Ich meinte wirklich [0.05, 0.95]:
Code:
TextH = text(0.05, 0.95, 'String', ...
  'Units', 'normalized', ...
  'HorizontalAlignment', 'left', ...
  'VerticalAlignment', 'top');
 

Das schreibt "String" mit einem Abstand von 5% der AXES-Ausdehnung in die linke obere Ecke.

So weit ok?

Wenn nun der Text nicht über die rechte Seite der AXES herrausragen darf, bleiben ihm 1.00 - 0.05, also 0.95 als Extent übrig. Also rediziere ich nun so lange die FontSize, bis das 3. Element von get(TextH, 'Extent'), also die Breite, kleiner ist als 0.95.
Ich persönlich hätte gerne den gleichen minimal Abstand links und rechts vom Rand, also würde ich 0.9 als obere Grenze setzten.

Bis hier immer noch ok?
Wir habe einen Text, der fast in der linken oberen Ecke ist und der nicht über den Rand hinaus geht (weder oben noch links nocht rechts).

Nun binde ich die FontSize dynamisch and die Axes-Größe:
Code:
set(TextH, 'FontUnits', 'normalized');

Wenn man per Figure-Resize das AXES-Objekt nun winzig macht, schrumpft die FontSize automatisch mit und der Text wird niemals die AXES-Grenzen überschreiten.

Das 'HorizontalAlignment', 'right', war in dem Sinne nicht schlecht, da so meine Textbox nie ueber den Axesrand geht. Aender ich dies jedoch zu 'left', so ist dies der Fall--> sieht bescheiden aus. Mit 'right' gefaellt mir jedoch der Text absolut nicht, da er nunmal linksbuendig sein soll.

Zitat:
Natuerlich ist die relative Position immer gleich wegen den normalisierten Units, ABER da die Textbox immer die gleiche Groesse hat, ist sie im 1. Beispiel schoen in der Ecke und im 2. Beispiel mitten im Bild.

Wieso? [0.05, 0.95] ist doch immer links oben, wenn die Units des Text-Objekts 'normalized' sind.
Man braucht angepasste X- und Y-Koordinaten nur, wenn die Units des Text-Objekts auf 'data' gestellt werden.

Zitat:
Ich habe das Gefuehl mann muesste davor schon wissen wie gross die Axes und Textbox ist und dementsprechend die Schriftgroesse der Textbox sowie die 'dazugehoerigen' x- und y Koordinten berechenen. Ich krieg es aber einfach nicht hin bzw. hab nicht wirklich eine Idee dafuer, leider!


In 'normalized' Units ist die AXES immer 1 breit und 1 hoch.
Du kannst aber auch get(AxesH, 'XLim') und get(AxesH, 'YLim') benutzen, um die Größe in 'data'-Units zu messen. Oder dies, um die Größe in 'pixels' zu messen:
Code:
set(AxesH, 'pixels');
PixelExtent = get(AxesH, 'Position');
PixelWidth = PixelExtent(3);
PixelHeight = PixelExtent(4);
 

Du musst also nur die AXES-Größe und die TEXT-Position in den gleichen Units messen: 'data', 'normalized' oder 'pixels'. Mit 'data' und 'pixels' kannst Du den Abstand von der linken oberen Ecke absolute bestimmen, mit 'normalized' relativ zur AXES Größe.

Es sollte wirklich so klappen. Ich mache das genauso um Beschriftungen so innerhalb meiner Diagramme unterzubringen, dass sie sowohl am Bildschirm, als auch in einem PDF oder auf DinA4 Papier und auf dem DinA0-Plakat mit sinnvoller Größe an der richtigen Stelle stehen.

Auf zur nächsten Iteration des Ideen-Austauschs, Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.10.2010, 23:26     Titel:
  Antworten mit Zitat      
Hallo Jan,

Zitat:

Auf zur nächsten Iteration des Ideen-Austauschs, Gruß, Jan

gerne Very Happy Very Happy Very Happy Very Happy Very Happy

Leider bin ich gerade sehr kurz angebunden, nur soviel: mir ist leider ein kleiner aber für meine Aufgabe entscheidenter Fehler im letzten Post unterlaufen. Ich möchte die Textbox nicht in der linken, sondern in der RECHTEN Ecke habe (daher auch das 0.95 statt 0.05).

Und genau da hab ich eben das Problem, dass ich nicht die richtigen normierten Koordinaten bzw. Schriftgröße finde, damit die Textbox 'in etwa' in der rechten Ecke ist. Daher ergibt sich dann auch das Problem mit der Schriftgröße, da ich in diesem Fall ja eigentlich keinen Platz mehr habe um Sie anzupassen, da der rechte Rand der Axes ja gleich daneben ist. Also müsste ich in dem Fall erst die Textbox weiter nach links bzw. unten setzen. Aber wo genau hin, wie genau verschieben, damit die Textbox mit der neuen (passenden) Schriftgröße schön bis in die Ecke reicht.

Auch wenn die Axes immer die Ausdehnung 1,1 haben, so ist die Größe der Textbox doch immer gleich (absolut, dh. in beiden Fällen z.b. 100Pixel), egal ob die Axes groß (1 Subplot) oder klein (bst. Axes bei 12 Subplots) dargestellt werden (Verweis auf meine beiden Beispiele).

Nochmals vielen Dank für deine Mühen, ich verstehe deinen Codebeispiele ohne Probleme, jedoch löst es irgendwie nicht mein Problem. Vielleicht könntest du mir einfach mal ein Beispiel basteln, wie meins aus dem ersten Post, nur das eben auch bei 12 Subplots, die Textbox schön in der rechten oberen Ecke ist.

Eigentlich ist dies ja nicht die Art die ich zur Lösungen von Problemen bevorzuge (nach kompletten Lösungen zu fragen), aber in diesen Fall wäre es vielleicht wirklich hilfreich....

Iterations_Counter = 7; Embarassed

MFG

Sco
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: 16.10.2010, 01:53     Titel:
  Antworten mit Zitat      
Hallo Sco,

Zitat:
Und genau da hab ich eben das Problem, dass ich nicht die richtigen normierten Koordinaten bzw. Schriftgröße finde, damit die Textbox 'in etwa' in der rechten Ecke ist.

Es bleibt rätselhaft.
Wenn man für ein Text-Objekt 'HorizontalAlignment'='right' setzt, wird die Position als rechte Begrenzung genutzt. Von dort aus wird das Textobjekt nach links geschoben. Der Extent bezieht sich aber immer auf die Gesamt-Breite, ist also ganz unabhängig von der absoluten Position.

Code:

figure;
axes;
text(0.95. 0.9, 'Kurz', 'HorizontalAlignment', 'right');
text(0.95. 0.7, 'Länger', 'HorizontalAlignment', 'right');
text(0.95. 0.5, 'Ziemlich lang', 'HorizontalAlignment', 'right');
text(0.95. 0.3, 'Einfach sehr sehr riesig', 'HorizontalAlignment', 'right');
 


Oder sprichst Du von einem UICONTROL('Style', 'text')? Das kann man nämlich nur über einen kleinen Umweg rechtsbündig ausrichten.

Als Code wiederhole ich einfach nochmal genau das, was ich bereits früher gepostet habe, mit einer FOR-Schleife drum herum:
Code:

figure;
Str = 'Rechts oben';
for iPlot = 1:12
  addStr = repmat('*', 1, iPlot);
  AxisH = subplot(3, 4, iPlot);   % Versuche auch (2,6, ) und (1,12, )!
  TextH = text(0.95, 0.95, [Str, addStr], ...
     'Units', 'normalized', ...
     'VerticalAlignment', 'top', ...
     'HorizontalAlignment', 'right', ...
     'Parent', AxisH, ...
     'FontName', 'Arial');

  for FontSize = [22, 16, 14, 12, 10, 9, 8, 7, 6, 5]
    set(TextH, 'FontSize', FontSize);
    % drawnow;   % Nicht nötig
    ext = get(TextH, 'Extent');
    if ext(3) < 0.9  % Oder 0.45: dann reichts nur bis zur Mitte
      break
    end
  end
  set(TextH, 'FontUnits', 'normalized');  % Für Resizing
end
 

Ich hatte zwar schon beide Teile gepostet, aber mir kommt es so vor, als würdest Du immer wieder genau nach dieser Methode fragen: Der Text sitzt exakt rechts oben, geht von dort nach links bis maximal 90% der AXES-Breite, also linke Seite ist mindestens 0.05.
Und bei einem Figure-Resize wird die Schriftgröße automatisch angepasst.

Genauso kannst Du auch einen Text an einen beliebigen Punkt setzen:
Code:

t = -pi:0.1:pi;
x = sin(t);
AxesH = axes('XLim', [-pi, pi], 'YLim', [-1 1]);
plot(t, x);
pos = [2, sin(2)];
TextH = text(pos1, pos2, 'Hallo', 'Units', 'data', ...
   'VerticalAlignment', 'middle', ...
   'HorizontalAlignment', 'center');
Ext = get(TextH, 'Extent');
% Nun wieder solange die FontSize verkleinern, bis
% Linker Rand: Ext(1) > -pi
% und rechter Rand: Ext(1) + Ext(3) < pi
 

Wenn es das gewesen ist, könntest Du als Gegenleistung ja mal einem neuen Gast anraten, seine Probleme ohne EVAL und ASSIGNIN zu lösen -- dann muss ich das nicht mehr tun ;-)
Wenn wir aber immer noch aneinander vorbei reden, gehen mir die Ideen aus.

Gute Nacht, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 18.10.2010, 12:01     Titel:
  Antworten mit Zitat      
Hallo Jan,

so ich hatte jetzt mal genug Zeit deinen Vorschlag durchzuarbeiten. Nochmals Danke fuer die Muehen.

Dein 2. Beispiel im letzten Post ist zu 95% was ich moechte und hilft mir schon enorm weiter. Das einzige 'Problem' was bleibt ist, dass wir das Textfeld horizontal 'right' ausrichten damit es nicht ueber die Axesgrenzen positioniert wird. Nun finde ich aber die rechte Ausrichtung des Text in der Textbox nicht besonders schoen, wenn, wie in meinen Beispiel, die Textbox aus mehreren Textzeilen aufgebaut ist. Ist es also moeglich den Text innerhalb der Textbox links, die gesamte Textbox aber rechts Auszurichten?

Ich habe mal einen Code drangehaengt, falls es nicht verstaendlich geworden ist.

1. dein Beispiel mit meinem String, 2. so wie ich es gern haette:
Code:

alldata.string = 'test';
alldata.num = 100;

figure('Units','normalized','Position',[0 0 1 1]);
for iPlot = 1:4
TextH=text(0.98,0.98,sprintf('%s = %.1f ms\n%s%.f ms\n%s%.2f%%\n%s%.4f',alldata.string,alldata.num,...
            'Ref = ',alldata.num,'Error = ',alldata.num,'R^2 = ',alldata.num),'Units','normalized',...
            'BackgroundColor',[1 1 1],'EdgeColor',[0 0 0],'Fontsize',9,'VerticalAlignment', 'top', ...
     'HorizontalAlignment', 'right', ...
     'Parent', AxisH, ...
     'FontName', 'Arial');

  for FontSize = [22, 16, 14, 12, 10, 9, 8, 7, 6, 5]
    set(TextH, 'FontSize', FontSize);
    % drawnow;   % Nicht nötig
    ext = get(TextH, 'Extent');
    if ext(3) < 0.35  % Oder 0.45: dann reichts nur bis zur Mitte
      break
    end
  end
  set(TextH, 'FontUnits', 'normalized');  % Für Resizing
end

% so haette ich es gern

figure('Units','normalized','position',[0 0 1 1]);
for iPlot = 1:4
subplot(2,2,iPlot) % 12 Subplots
text(0.70,0.82,sprintf('%s = %.1f ms\n%s%.f ms\n%s%.2f%%\n%s%.4f',alldata.string,alldata.num,...
            'Ref = ',alldata.num,'Error = ',alldata.num,'R^2 = ',alldata.num),'Units','normalized',...
            'BackgroundColor',[1 1 1],'EdgeColor',[0 0 0],'Fontsize',16);
end
 

Du Koordinaten im 2. Beispiel hab ich empirisch ermittelt, weil ich eben nicht weiss wie es bei linksbuendig automatisch gehen wuerde, wenn die Textbox in der rechten Ecke sein soll.


Zitat:

Wenn es das gewesen ist, könntest Du als Gegenleistung ja mal einem neuen Gast anraten, seine Probleme ohne EVAL und ASSIGNIN zu lösen -- dann muss ich das nicht mehr tun Wink

Keine Sorge ich habe mir schon einen Shortcut mit einem Standardsatz eingerichtet (und verwendet), aber wie du schon oft mitbekommen hasst, dies stoesst meist auf taube Ohren Very Happy

MFG

Sco
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: 18.10.2010, 18:51     Titel:
  Antworten mit Zitat      
Hallo Sco!

Du kannst das Text-Feld erstellten (rechts oder linksbündig ist ganz egal), dann die FontSize solange verändern, bis es in die AXES passt. Nun kannst Du den Wert von "get(TextH, 'Extent')" benutzen, um die korrekte Position für einen linksbündigen Text zu berechnen:
Code:

Msg = {'*', 'Guten Morgen!', '--'};
AxesH = axes;
TextH = text(0.95, 0.95, Msg, ...  % egal ob right oder left
   'FontSize', 12, ...  % FontSize wie oben passend machen
   'Units', 'normalized', ...
   'VerticalAlignment', 'top');
TextExt = get(TextH, 'Extent');
TextWidth = TextExt(3);
set(TextH, 'Position', [0.95 - TextWidth, 0.95], ...
  'HorizontalPosition', 'left');
 

Der Trick ist ganz einfach: Zuerst den Text erstellen, dann ausmessen ('Extent'), danach die gemessene Breite benitzen um den Abstand vom rechten Rand der AXES zu bestimmen.
Also irgendwie würde ich das genauso machen, wenn ich den Text auf Papier schreiben, ausschneiden und per Hand verschieben würde.

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

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 19.10.2010, 12:33     Titel:
  Antworten mit Zitat      
Hallo Jan,

kann meinen Dank nicht in Worte fassen, das suche ich echt schon so lange... Gib deine Adresse und ich schick dir nen Cider (Apfelbier) hier aus Schottland Smile.

MFG und auf eine weitere gute Zusammenarbeit (auch wenn du ja eher weniger, oder genau genommen keine Fragen hasst Wink )

Sco
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: 19.10.2010, 12:47     Titel:
  Antworten mit Zitat      
Hallo Sco,

Sehr schön. Ein gelöstes Problem ist ein gutes Problem!

Zitat:
MFG und auf eine weitere gute Zusammenarbeit (auch wenn du ja eher weniger, oder genau genommen keine Fragen hasst

Ich bereite mich immer noch die alles entscheidende Frage vor. Ich dachte mir, ich gebe zuerstmal 1000 Antworten, bevor ich die Frage stelle, die 1000 Köpfe zum Rauchen bringen wird :-)

Gruß, Jan
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.