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

Achsenskalierung ändern

 

stpasink
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 13:50     Titel: Achsenskalierung ändern
  Antworten mit Zitat      
Ich möchte dass beim plotte auf der y-Achse bestimmte Anzahl an Werten abgebildet wird. Dabei soll die y-Achse automatisch unterteilt werden. Es dürfen nur gerade Werte wie z.B -10000 -5000 0 5000 ...100 50 usw. vorkommen. Die minimalen und die maximalen yTicks bereiten mir keine Probleme. Ich habe nur mit den Abständen Probleme.

In diesem Fall mit dem delta.
Zitat:

set(gca,'Ytick',[-100000:delta:1000000])


Das "delta" soll so sein, dass auf der y-Achse etwa 5-10 Werte dargestellt werden und diese delta
1 keine Kommazahl und
2 ein "gerader" Wert ist (z.B 100 oder 500 oder 5000 oder 10 usw)

Aus einem anderen Beitrag konnte ich folgendes entnehmen

Zitat:

max_y = max(FGas);
min_y = min(FGas);
anz_ticks = 10;
delta = (max_y - min_y)/anz_ticks;
set(gca,'Ytick',[-10000:delta:100000])



Hier bekomme ich für delta so gut wie immer eine Kommazahl und keinen gewünschten Wert. Hier bekomme ich zum Beispiel 2389 raus. Ich hätte mir in diesem Fall 1000 gewünscht.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2015, 16:24     Titel:
  Antworten mit Zitat      
Hallo,

spräche etwas dagegen, delta zu runden ( round )? z.B. auf 1000er ?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stpasink
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 17:01     Titel:
  Antworten mit Zitat      
Nein. Es spricht nichts dagegen. Aber wie kann ich 2389 auf 1000 runden? Könnte man auch eine beliebige Zahl runden? Zum Beispiel wenn ich 34 habe, dann soll delta 50 sein. Es soll immer etwas "Gerades" entstehen. wenn ich 3850 bekomme dann soll delta 4000 betragen usw. Folgende delta-Werte sind je nach "unrunden Zahl" erwünscht: 10, 50, 100, 500, 1000, .... So, dass die Zahlen auf der y-Achse ordentlich aussehen.
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: 02.08.2015, 17:51     Titel: Re: Achsenskalierung ändern
  Antworten mit Zitat      
Hallo stpasink,

Wieso bist Du mit dem doch eigentlich sehr guten Tick-Werten von Matlabs plot Befehl nicht zufrieden? Da werden doch automatisch 5 bis 10 runde Werte ausgewählt.

"]Ich möchte dass beim plotte auf der y-Achse bestimmte Anzahl an Werten abgebildet wird. Dabei soll die y-Achse automatisch unterteilt werden. Es dürfen nur gerade Werte wie z.B -10000 -5000 0 5000 ...100 50 usw. vorkommen. Die minimalen und die maximalen yTicks bereiten mir keine Probleme. Ich habe nur mit den Abständen Probleme.

Zitat:
Code:
       set(gca,'Ytick',[-10000:delta:100000])

Hier bekomme ich für delta so gut wie immer eine Kommazahl und keinen gewünschten Wert. Hier bekomme ich zum Beispiel 2389 raus. Ich hätte mir in diesem Fall 1000 gewünscht.

Wieso 1000? Du wolltest 5 bis 10 Ticks. Mit 1000 sind es aber 110 Werte. Meinst Du 10'000? Dann wären es immer noch 11, statt der 10.
Wenn Du das gewünschte Ziel nur so ungefähr beschreibst, ist es viel schwieriger eine Lösung vorzuschlagen. Denn dann muss man sich nicht nur Gedanken über eine Implementierung in Matlab machen, sondern auch darüber, was Du denn gerne hättest. Bitte erkläre es also nochmal möglichst exakt.

Code:
MaxSteps = 10;
Low = -10000;
High = 100000;
Step = (High - Low) / MaxSteps;
RoundStep = 10^(ceil(log10(Step)) - 1); % Oder ROUND

Das funktioniert nicht zuverlässig: Bei -0.5 bis 0.5 gibt es als RoundStep 0.01 aus. Aber die Lösung wird wohl in dieser Richtung liegen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 18:06     Titel:
  Antworten mit Zitat      
Zitat:

Wieso bist Du mit dem doch eigentlich sehr guten Tick-Werten von Matlabs plot Befehl nicht zufrieden?


Die yTicks passen zwar, aber die y-Achse wird in Potenzzahlen angegeben z.B 4*10^4 . Das will ich nicht haben.

Das wollte ich mit
Code:

 yticks=get(gca,'YTick');
        yticks_strings = cellstr(num2str(yticks'));
        set(gca,'YTickLabel',yticks_strings );

 

umgehen. Aber wenn ich die yTicks nicht selbst setze, dann bekomme ich auf der y-Achse zwar keine Potenzen mehr, aber die Zahlenreihenfolge ist total durcheinander. Wenn man die y-Achse von unten nach oben anschaut, dann steht dor zum Beispiel. -2000,-1000,0,4000,2000,0. Also total durcheinander das Ganze. Um dieses Problem zu vermeiden, will ich die yTicks selbst setzen. Ich weiß ansonsten nicht wie ich das Problem lösen soll?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2015, 18:13     Titel:
  Antworten mit Zitat      
Hallo,

meiner Erfahrung nach funktioniert
Code:
yticks=get(gca,'YTick');
yticks_strings = cellstr(num2str(yticks'));
set(gca,'YTickLabel',yticks_strings );

wunderbar, wenn man die Potenzen loswerden möchte.

Bitte ein konkretes, reproduzierbares Beispiel zur Verfügung stellen, in dem das nicht wie gewünscht funktioniert.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stpasink
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 18:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

der Fehler tritt beim subplot auf. wenn ich das Diagramm einzeln zeichnen, dann ist alles in Ordnung. Woran liegt das? PS: Ich habe die Positionen der Grafen im subplot ein wenig modifiziert. Hat es damit etwas zu tun?. Die pdf. Datei ist im Anhang.

Datei.pdf
 Beschreibung:

Download
 Dateiname:  Datei.pdf
 Dateigröße:  143.02 KB
 Heruntergeladen:  413 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2015, 18:55     Titel:
  Antworten mit Zitat      
Hallo,

jetzt sehe ich zwar das Ergebnis, aber nicht den Code, der das Ergebnis produziert - und das ist ja das entscheidende.
gca ist das momentane Koordinatensystem. Wenn man mit subplots arbeitet, ändert sich das momentane Koordinatensystem ständig. Ich würde da also nicht mit gca arbeiten, sondern mit Handles.
Code:

ax(1) = subplot(m, n, k);
...
yticks=get(ax(1),'YTick');
yticks_strings = cellstr(num2str(yticks'));
set(ax(1),'YTickLabel',yticks_strings );


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stpasink
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 19:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

Das ist ein Teil des Codes
Code:

subplot(3,2,3,'Position', [.07 .4 .3 .23])
    plot(alpha,Mo,'b','LineWidth',1.5)
    hold;
    plot(alpha,MGas,'m','LineWidth',1.5)
    plot(alpha,Mges,'g','LineWidth',1.5)
    hold off
    % Intervall der x-Achse festlegen
    xlim([0,720])
    grid
    t1=title(['Momente beim' ' ' num2str(z) ' ' 'Zylinder' ' ' name]);
    % Schriftgröße des Titels ändern
    set(t1,'FontSize',14)    
    % Schrittweite auf der x-Achse auf 90° festlegen
    set(gca,'Xtick',0:90:720)
    % Schrittweite auf der y-Achse automatisch anpassen
    MaxSteps = 10;
    Low = -10000;
    High = 10000;
    Step = (High - Low) / MaxSteps;
    RoundStep = 10^(ceil(log10(Step)) - 1); % Oder ROUND
    set(gca,'Ytick',-10000:RoundStep:10000)
%   Zahlenformat der y-Achse ändern von exponentiell zu dezimal
    yticks=get(gca,'YTick');
    yticks_strings = cellstr(num2str(yticks'));
    set(gca,'YTickLabel',yticks_strings )
    y1=xlabel('Kurbelwellenwinkel[°]');
    % Titel der x-Achse "fett machen"
    set(y1,'FontWeight','bold')
    y2=ylabel('Moment M [Nm]');
    % Titel der y-Achse "fett machen"
    set(y2,'FontWeight','bold')
    % Titelfarbe auf rot ändern
    set(t1,'color','r')
    % Legende setzen
    legend ('Mo [Nm]','Location','NE','MGas [Nm]','Location','NE',...
        'Mges [Nm]','Location','NE')

 


Und das Ergebnis hast du ja bereits gesehen. Wie gesagt passen die Zahlen auf der y-Achse im subplot nicht. Nur wenn ich das Diagramm einzeln plotte, dann passt es
Code:

figure('NumberTitle','off','Name','Diagramm F, M')
        plot(alpha,Mo,'b','LineWidth',1.5)
        hold
        plot(alpha,MGas,'m','LineWidth',1.5)
        plot(alpha,Mges,'g','LineWidth',1.5)
        hold off

        % Intervall der x-Achse festlegen
        xlim([0,720])
        grid
        t1=title(['Momente beim' ' ' num2str(z) ' ' 'Zylinder' ' ' name]);
        % Schriftgröße des Titels ändern
        set(t1,'FontSize',14)    
        % Schrittweite auf der x-Achse auf 90° festlegen
        set(gca,'Xtick',0:90:720)
        % Schrittweite auf der y-Achse automatisch anpassen
        MaxSteps = 10;
        Low = -10000;
        High = 100000;
        Step = (High - Low) / MaxSteps;
        RoundStep = 10^(ceil(log10(Step)) - 1); % Oder ROUND
        set(gca,'Ytick',-100000:RoundStep:1000000)
        % Zahlenformat der y-Achse ändern von exponentiell zu dezimal
        yticks=get(gca,'YTick');
        yticks_strings = cellstr(num2str(yticks'));
        set(gca,'YTickLabel',yticks_strings );
        y1=xlabel('Kurbelwellenwinkel[°]');
        % Titel der x-Achse "fett machen"
        set(y1,'FontWeight','bold')
        y2=ylabel('Moment M [Nm]');
        % Titel der y-Achse "fett machen"
        set(y2,'FontWeight','bold')
        % Titelfarbe auf rot ändern
        set(t1,'color','r')
        % Legende setzen
        legend ('Mo [Nm]','Location','NE','MGas [Nm]','Location','NE',...
            'Mges [Nm]','Location','NE')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
stpasink
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2015, 19:14     Titel:
  Antworten mit Zitat      
Hallo Harald,

sorry das war der vorherige Code. Der stimmt nicht ganz. Ich meinte diesen code

Code:

subplot(3,2,3,'Position', [.07 .4 .3 .23])
    plot(alpha,Mo,'b','LineWidth',1.5)
    hold;
    plot(alpha,MGas,'m','LineWidth',1.5)
    plot(alpha,Mges,'g','LineWidth',1.5)
    hold off

    % Intervall der x-Achse festlegen
    xlim([0,720])
    grid
    t1=title(['Momente beim' ' ' num2str(z) ' ' 'Zylinder' ' ' name]);
    % Schriftgröße des Titels ändern
    set(t1,'FontSize',14)    
    % Schrittweite auf der x-Achse auf 90° festlegen
    set(gca,'Xtick',0:90:720)
    yticks=get(gca,'YTick');
    yticks_strings = cellstr(num2str(yticks'));
    set(gca,'YTickLabel',yticks_strings )
    y1=xlabel('Kurbelwellenwinkel[°]');
    % Titel der x-Achse "fett machen"
    set(y1,'FontWeight','bold')
    y2=ylabel('Moment M [Nm]');
    % Titel der y-Achse "fett machen"
    set(y2,'FontWeight','bold')
    % Titelfarbe auf rot ändern
    set(t1,'color','r')
    % Legende setzen
    legend ('Mo [Nm]','Location','NE','MGas [Nm]','Location','NE',...
        'Mges [Nm]','Location','NE')
 


Und dieser code funktioniert
Code:

figure('NumberTitle','off','Name','Diagramm F, M')
        plot(alpha,Mo,'b','LineWidth',1.5)
        hold
        plot(alpha,MGas,'m','LineWidth',1.5)
        plot(alpha,Mges,'g','LineWidth',1.5)
        hold off

        % Intervall der x-Achse festlegen
        xlim([0,720])
        grid
        t1=title(['Momente beim' ' ' num2str(z) ' ' 'Zylinder' ' ' name]);
        % Schriftgröße des Titels ändern
        set(t1,'FontSize',14)    
        % Schrittweite auf der x-Achse auf 90° festlegen
        set(gca,'Xtick',0:90:720)
        % Zahlenformat der y-Achse ändern von exponentiell zu dezimal
        yticks=get(gca,'YTick');
        yticks_strings = cellstr(num2str(yticks'));
        set(gca,'YTickLabel',yticks_strings );
        y1=xlabel('Kurbelwellenwinkel[°]');
        % Titel der x-Achse "fett machen"
        set(y1,'FontWeight','bold')
        y2=ylabel('Moment M [Nm]');
        % Titel der y-Achse "fett machen"
        set(y2,'FontWeight','bold')
        % Titelfarbe auf rot ändern
        set(t1,'color','r')
        % Legende setzen
        legend ('Mo [Nm]','Location','NE','MGas [Nm]','Location','NE',...
            'Mges [Nm]','Location','NE')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.08.2015, 21:25     Titel:
  Antworten mit Zitat      
Hallo,

"reproduzierbar" bedeutet grundsätzlich, dass man den Code direkt kopieren und ausführen kann. Dazu fehlen hier jedoch Beispieldaten.
Mit selbst gewählten Beispieldaten kann ich das Problem insofern nachvollziehen, dass sich bei einer Veränderung der Größe der Figure dieser Effekt einstellt. Das kann verhindert werden, indem man
Code:
   set(gca,'YTick', yticks, 'YTickLabel',yticks_strings )

verwendet.
Falls das nicht hilft, bitte wirklich reproduzierbaren Code zur Verfügung stellen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
stpasink
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2015, 12:11     Titel:
  Antworten mit Zitat      
Hallo Harald,

auf der y-Achse sind die Zahlen immer noch in der falschen Reihenfolge. Ich habe dir im Anhand die Dateien KraftMoment_test und EingabeG angehängt. EingabeG wird an die Funktion KraftMoment_test übergeben, dann werden die Diagramme gezeichnet.

KraftMoment_test.m
 Beschreibung:

Download
 Dateiname:  KraftMoment_test.m
 Dateigröße:  63.51 KB
 Heruntergeladen:  376 mal
EingabeG.mat
 Beschreibung:

Download
 Dateiname:  EingabeG.mat
 Dateigröße:  874 Bytes
 Heruntergeladen:  348 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.08.2015, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

hast du denn meinen Vorschlag von 02.08.2015, 21:25 umgesetzt?

Ich würde übrigens dringend überlegen, wie man dieses Projekt sinnvoll strukturieren kann. Es sollte eine übersichtlichere Möglichkeit geben als eine gigantische Funktion mit 2400 Zeilen.

Grüße,
Harald
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: 03.08.2015, 15:59     Titel:
  Antworten mit Zitat      
Hallo stpasink,

Nochmal eine Erklärung dazu, was "reproduzierbar" bedeutet:
Du hast jetzt zwar die Daten und den Code gepostet. Der Code hat allerdings ein Input-Argument. Da dies aber nicht dokumentiert ist, kann ich kaum erraten, welcher Input-Strukt hier zu sinnvollen Ergebnissen führt.

In einem Forum kann man auch nicht erwarten, dass jemand hunderte Zeilen Code durch liest um die problemantischen Zeilen zu finden. Deshalb ist es immer besser ein Minimal-Beispiel zu posten, welches die Fehler reproduziert. Als Daten sind dann rand oder 1:1000 am einfachsten, falls damit der Fehler erzeugt wird.

Ich vermute, dass Haralds Tipp das Problem löst: Wenn die Ticks von Hand gesetzt werden (oder der XTickMode auf 'manual'), sollten die Verschiebungen nicht mehr auftauchen.

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.