Introducción a matlab guía, un traspié. Tengo tan simple como puedo como un juguete gui para ilustrar mi problema. Una interfaz gráfica de usuario (nombre de asa) tiene un pulsador y un eje. El callback del botón, se lee

axesHandle= findobj(gcf,'Tag','axes1');
x=rand(randi(10+20,1),4);
plot(axesHandle, x)

Hay ningún otro código escrito por mí (guía escribió).

La 1 ª vez que pulse el botón, todo está bien: la trama se lleva a cabo. La 2ª vez, me sale un error que, desde la consola:

Error using plot
Vectors must be the same lengths.

Error in asas>pushbutton1_Callback (line 83)
plot(axesHandle, x)

Error in gui_mainfcn (line 96)
        feval(varargin{:});
etc...

Quiero trazar los nuevos datos x, reemplazando la antigua.

Parece que matlab no es la sustitución de los datos de la trama, pero de alguna manera tratando de anexar a la trama?

He buscado, pero no he encontrado nada que se aplica.

  • Hace este trabajo, es decir, sólo este código x=rand(randi(10+20,1),4); plot(x)?
  • Gracias Dan para una respuesta más rápida. sí, funciona! Pensé que siempre he tenido para especificar dónde trazar — va a demostrar mi ignorancia, supongo. Alguna sugerencia de por qué mi código original fue mal (Dan o cualquier otra persona), por favor?
  • Me imagino que la forma que tenía antes no era borrar el gráfico. Probablemente lo mejor es mantener una forma similar a como lo tenía antes, pero acaba de borrar manualmente el gráfico antes de trazar de nuevo, pero no estoy 100% acerca de todo eso.
  • En términos de sustitución de la antigua parcela, podría simplemente implementar clf sobre el botón de la prensa, así que voy a tratar siempre de parcela en una limpieza de la parcela.
InformationsquelleAutor pedro silva | 2012-07-09

1 Comentario

  1. 8

    La explicación no es sencilla y, ciertamente, no se si son nuevos con MATLAB y sus manejar subsistema de gráficos.

    Su código, línea por línea:

    axesHandle= findobj(gcf,'Tag','axes1');
    x=rand(randi(10+20,1),4);
    plot(axesHandle, x);

    La primera línea de los intentos de localizar en la cifra actual (gcf, «get current figure) cualquier niño objeto con la propiedad 'Tag' conjunto de la cadena de 'axes1'. Supongo que eres consciente de ello? La segunda línea de curso genera algunos datos aleatorios para la trama. La tercera línea de parcelas de los datos en x.

    Pero después de la plot-llamar a la propiedad 'Tag' es en realidad reset para '' (cadena vacía), que a su vez hace findobj fallar en cualquiera de las siguientes búsquedas de los ejes de manejar. La variable axesHandle con por lo tanto NO contienen una manija real, sino que el vacío de la matriz []. Esto hará que la trama predeterminado a otro modo de interpretar el vacío de la matriz de datos para los ejes-x (el primer argumento a plot). Este es de esperar que los resultados en el error que usted recibe:

    ...
    Error using plot Vectors must be the same lengths.
    ...

    La solución por Dan en el comentario de arriba es una solución, pero no es de buen sentido en el relato de plot donde la trama – especialmente en GUIs.

    Usted puede en lugar de agregar una cuarta línea:

    set(axesHandle,'Tag','axes1');

    De esta forma se establecerá la propiedad 'Tag' de vuelta a 'axes1' y el posterior clic en el botón ahora debería funcionar también. Y usted puede agregar más de uno de los ejes de los objetos de ahora. Si eso es lo que desea.

    • Gracias otra vez a todos los que respondieron, especialmente a Ole para embellecer mi pregunta, y proporcionar una larga y esclarecedora respuesta. Sin duda habría subido su respuesta, se me «de buena reputación» suficiente (a pesar de que podría haber cambiado también «es» a «su» en la primera línea…). Yo no tenía absolutamente ninguna idea de que después de la parcela-llamar a la propiedad ‘Etiqueta’ se ha restablecido a la cadena vacía. He seguido su «línea 4» de la solución, y funcionó.
    • Ahora usted debería ser capaz de votar a favor 😛 me alegra que trabajó. Por favor también aceptar la respuesta si se resuelve el problema.
    • hecho y hecho! .
    • Ole la respuesta es clara y grande! Gracias!

Dejar respuesta

Please enter your comment!
Please enter your name here