Zoeken…


Opmerkingen

  • Het gebruik van ongedocumenteerde functies wordt als een risicovolle praktijk beschouwd 1 , omdat deze functies zonder kennisgeving kunnen worden gewijzigd of gewoon anders werken op verschillende MATLAB-versies. Om deze reden wordt geadviseerd om defensieve programmeertechnieken te gebruiken, zoals het omsluiten van stukjes code zonder papieren in try/catch blokken met gedocumenteerde fallbacks.

C ++ compatibele helperfuncties

Het gebruik van Matlab Coder ontkent soms het gebruik van enkele veel voorkomende functies, als deze niet compatibel zijn met C ++. Relatief vaak bestaan er ongedocumenteerde helperfuncties , die kunnen worden gebruikt als vervanging.

Hier is een uitgebreide lijst met ondersteunde functies. .

En een aantal alternatieven volgen voor niet-ondersteunde functies:


De functies sprintf en sprintfc lijken veel op elkaar, de voormalige returns een karakter array, waarbij de laatste een cel string:

 str = sprintf('%i',x)   % returns '5' for x = 5
 str = sprintfc('%i',x)  % returns {'5'} for x = 5

sprintfc is echter compatibel met C ++ ondersteund door Matlab Coder, en sprintf is dat niet.

Kleurgecodeerde 2D-lijnplots met kleurgegevens in de derde dimensie

In MATLAB-versies voorafgaand aan R2014b , waarbij de oude grafische HG1-engine werd gebruikt, was het niet duidelijk hoe 2D-gecodeerde 2D- lijnplots konden worden gemaakt. Met de release van de nieuwe grafische HG2-engine ontstond een nieuwe ongedocumenteerde functie geïntroduceerd door Yair Altman :

n = 100;
x = linspace(-10,10,n); y = x.^2;
p = plot(x,y,'r', 'LineWidth',5);

% modified jet-colormap
cd = [uint8(jet(n)*255) uint8(ones(n,1))].';

drawnow
set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)

lijn plot

Semi-transparante markeringen in lijn- en spreidingsplots

Sinds Matlab R2014b is het eenvoudig mogelijk om semi-transparante markeringen te verkrijgen voor lijn- en spreidingsplots met behulp van ongedocumenteerde functies geïntroduceerd door Yair Altman .

Het basisidee is om de verborgen greep van de markeringen te krijgen en een waarde <1 toe te passen voor de laatste waarde in de EdgeColorData om de gewenste transparantie te bereiken.

Hier gaan we voor scatter :

%// example data
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);

%// plot scatter, get handle
h = scatter(x,y); 
drawnow; %// important

%// get marker handle
hMarkers = h.MarkerHandle; 

%// get current edge and face color
edgeColor = hMarkers.EdgeColorData
faceColor = hMarkers.FaceColorData

%// set face color to the same as edge color
faceColor = edgeColor;

%// opacity
opa = 0.3;

%// set marker edge and face color
hMarkers.EdgeColorData = uint8( [edgeColor(1:3); 255*opa] ); 
hMarkers.FaceColorData = uint8( [faceColor(1:3); 255*opa] ); 

voer hier de afbeeldingsbeschrijving in

en voor een plot

%// example data
x = linspace(0,3*pi,200);
y1 = cos(x);
y2 = sin(x);

%// plot scatter, get handle
h1 = plot(x,y1,'o-','MarkerSize',15); hold on
h2 = plot(x,y2,'o-','MarkerSize',15); 
drawnow; %// important

%// get marker handle
h1Markers = h1.MarkerHandle; 
h2Markers = h2.MarkerHandle; 

%// get current edge and face color
edgeColor1 = h1Markers.EdgeColorData;
edgeColor2 = h2Markers.EdgeColorData;

%// set face color to the same as edge color
faceColor1 = edgeColor1;
faceColor2 = edgeColor2;

%// opacity
opa = 0.3;

%// set marker edge and face color
h1Markers.EdgeColorData = uint8( [edgeColor1(1:3); 255*opa] ); 
h1Markers.FaceColorData = uint8( [faceColor1(1:3); 255*opa] ); 
h2Markers.EdgeColorData = uint8( [edgeColor2(1:3); 255*opa] ); 
h2Markers.FaceColorData = uint8( [faceColor2(1:3); 255*opa] ); 

voer hier de afbeeldingsbeschrijving in

De markeringshandgrepen, die worden gebruikt voor de manipulatie, worden met de figuur gemaakt. De opdracht drawnow zorgt ervoor dat de figuur wordt gemaakt voordat de volgende opdrachten worden aangeroepen en voorkomt fouten in het geval van vertragingen.

Contourplots - Pas de tekstlabels aan

Bij het weergeven van labels op contouren laat Matlab u niet toe het formaat van de getallen te regelen, bijvoorbeeld om te veranderen in wetenschappelijke notatie.

De afzonderlijke tekstobjecten zijn normale tekstobjecten, maar hoe u ze krijgt is niet gedocumenteerd. U TextPrims ze vanuit de eigenschap TextPrims van de contourhandgreep.

  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  drawnow();
  txt = get(h,'TextPrims');
  v = str2double(get(txt,'String'));
  for ii=1:length(v)
    set(txt(ii),'String',sprintf('%0.3e',v(ii)))
  end

Opmerking : dat u een drawnow opdracht moet toevoegen om Matlab te dwingen de contouren te tekenen, het aantal en de locatie van de txt-objecten worden alleen bepaald wanneer de contouren daadwerkelijk worden getekend, zodat de tekstobjecten alleen dan worden gemaakt.

Het feit dat de txt-objecten worden gemaakt wanneer de contouren worden getekend, betekent dat ze opnieuw worden berekend telkens wanneer de plot opnieuw wordt getekend (bijvoorbeeld het formaat van de figuur wijzigen). Om dit te beheren moet je luisteren naar het undocumented event MarkedClean :

function customiseContour
  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  % add a listener and call your new format function
  addlistener(h,'MarkedClean',@(a,b)ReFormatText(a))
end
function ReFormatText(h)
  % get all the text items from the contour
  t = get(h,'TextPrims');
  for ii=1:length(t)
    % get the current value (Matlab changes this back when it 
    %   redraws the plot)
    v = str2double(get(t(ii),'String'));
    % Update with the format you want - scientific for example
    set(t(ii),'String',sprintf('%0.3e',v));
  end
end

voer hier de afbeeldingsbeschrijving in

Voorbeeld getest met Matlab r2015b op Windows

Items toevoegen / toevoegen aan een bestaande legende

Bestaande legendes kunnen moeilijk te beheren zijn. Als uw plot bijvoorbeeld twee regels heeft, maar er slechts één een legenda-invoer heeft en dat moet zo blijven, dan kan het toevoegen van een derde regel met een legenda-invoer moeilijk zijn. Voorbeeld:

figure
hold on
fplot(@sin)
fplot(@cos)
legend sin  % Add only a legend entry for sin
hTan = fplot(@tan);  % Make sure to get the handle, hTan, to the graphics object you want to add to the legend

Om nu een legenda-item toe te voegen voor tan , maar niet voor cos , is een van de volgende regels niet voldoende; ze falen allemaal op de een of andere manier:

legend tangent  % Replaces current legend -> fail
legend -DynamicLegend  % Undocumented feature, adds 'cos', which shouldn't be added -> fail
legend sine tangent  % Sets cos DisplayName to 'tangent' -> fail
legend sine '' tangent  % Sets cos DisplayName, albeit empty -> fail
legend(f)

Gelukkig houdt een ongedocumenteerde legende-eigenschap genaamd PlotChildren de kinderen van de ouderfiguur 1 bij . Dus, de manier om te gaan is om de kinderen van de legende expliciet als volgt in te stellen via de eigenschap PlotChildren :

hTan.DisplayName = 'tangent';  % Set the graphics object's display name
l = legend;
l.PlotChildren(end + 1) = hTan;  % Append the graphics handle to legend's plot children

De legenda wordt automatisch bijgewerkt als een object wordt toegevoegd aan of verwijderd uit de eigenschap PlotChildren .

1 Inderdaad: figuur. U kunt het onderliggende DisplayName een figuur met de eigenschap DisplayName aan elke legenda in de figuur, bijvoorbeeld uit een ander subplot. Dit komt omdat een legende op zichzelf in wezen een assenobject is.

Getest op MATLAB R2016b

Scatter plot jitter

De scatter heeft twee ongedocumenteerde eigenschappen 'jitter' en 'jitterAmount' waarmee de gegevens alleen op de x-as kunnen worden 'jitterAmount' . Dit dateert uit Matlab 7.1 (2005) en mogelijk eerder.

Om deze functie in te schakelen, stelt u de eigenschap 'jitter' in op 'on' en stelt u de eigenschap 'jitterAmount' in op de gewenste absolute waarde (de standaardwaarde is 0.2 ).

Dit is erg handig wanneer we overlappende gegevens willen visualiseren, bijvoorbeeld:

scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);

jitter overlappende gegevens

Lees meer over Matlab zonder papieren



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow