Farbvektor an Plot-Befehl übergeben
@mcatis: Weil Du immer noch den gleichen Fehler machst: Ein Array mit einem Element ist nicht das gleiche wie ein Element.
Du übergibst schon wieder eine Liste, welche eine Liste enthält. Du solltest unbedingt noch einmal die Grundlagen von Indexzugriffen durcharbeiten und die Unterschiede von ``data``, ``data[i:]`` und ``data[:i]`` verstehen. Warum machst du überhaupt den Umweg über ein numpy-Array, wenn es eine einfache Liste auch tun würde?
Das Muster
ist in Python ein Anti-Pattern. Du kannst direkt über Elemente einer Liste iterieren. Wenn du doch mal den Index brauchst, dann verwende die enumerate-Funktion.
Und bitte zeige immer die gesamte Fehlermeldung und zwar inklusive des gesamten Tracebacks, nicht nur den Teil, den du für wichtig erachtest. Dort stehen noch viel mehr Informationen, zum Beispiel *wo* der Fehler auftritt, drin.
Das Muster
Code: Alles auswählen
for i range(len(data)):
data[i] ...
Und bitte zeige immer die gesamte Fehlermeldung und zwar inklusive des gesamten Tracebacks, nicht nur den Teil, den du für wichtig erachtest. Dort stehen noch viel mehr Informationen, zum Beispiel *wo* der Fehler auftritt, drin.
Das Leben ist wie ein Tennisball.
Also so klappt's:
Aber das hatte ich ja schon mal. Dann setzt er die Farben zwar, aber ich verliere die Information der ersten Farben.
Er zeichnet den 1. Marker in der korrekten Farbe. Dann kommt der 2. Marker: Auch hier nimmt er die korrekte Farbe, setzt dann aber den 1. in der gleichen Farbe wie
den 2. Genau das ist ja das Problem. Deshalb wollte ich ähnlich wie bei den data-Vektoren für die lat-lon-Infos auch bei den Farben einen Vektor übergeben
der sich von Durchlauf zu Durchlauf weiter "aufbläht".
Wie kann ich denn erreichen, dass er die Farbe des 1. Markers nicht überschreibt?
Lg und danke schonmal für alles.
Code: Alles auswählen
import matplotlib
matplotlib.use('Agg')
import matplotlib.cm as cm
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import matplotlib.animation as animation
lon = [7.3, 8.7, 8.4, 11.2]
lat = [52.9, 52.0, 53.8, 50.9]
fig = plt.figure(figsize=(8,8),facecolor='w')
m = Basemap(llcrnrlon=4.0,urcrnrlon=15.0,llcrnrlat=46.0,urcrnrlat=56.0,\
rsphere=(6378137.00,6356752.3142),\
resolution='l',projection='merc',\
lat_ts=0.,suppress_ticks=True)
m.drawmapboundary(fill_color='w')
m.drawcoastlines(linewidth=0.3)
l, = m.plot([], [], c=[], marker="+", markersize=3)
xx = []
yy = []
for i in range(len(lon)):
xpt,ypt = m(lon[i],lat[i])
xx.append(xpt)
yy.append(ypt)
data = np.vstack([xx,yy])
colormap = ('0.1','0.3','0.6','0.9','0.35','0.78','0.35','0.78','0.35','0.78',
'0.35','0.78','0.35','0.78','0.35','0.78','0.35','0.78','0.35','0.78',
'0.35','0.78','0.35','0.78','0.35','0.78','0.35','0.78','0.35','0.78')
def animate(num, data, point):
num = num+1
point.set_data(data[0,:num],data[1,:num])
point.set_color(colormap[num])
return point,
ani = animation.FuncAnimation(fig, animate, frames=len(data[1]), blit=True, fargs=(data,l), interval=500, repeat=False)
ani.save('test.gif', writer='imagemagick')
Er zeichnet den 1. Marker in der korrekten Farbe. Dann kommt der 2. Marker: Auch hier nimmt er die korrekte Farbe, setzt dann aber den 1. in der gleichen Farbe wie
den 2. Genau das ist ja das Problem. Deshalb wollte ich ähnlich wie bei den data-Vektoren für die lat-lon-Infos auch bei den Farben einen Vektor übergeben
der sich von Durchlauf zu Durchlauf weiter "aufbläht".
Wie kann ich denn erreichen, dass er die Farbe des 1. Markers nicht überschreibt?
Lg und danke schonmal für alles.
@mcatis: Das geht mit `plot()` gar nicht. Ich habe gerade etwas gemacht was man vielleicht viel früher mal hätte machen sollen: In die Dokumentation geschaut. Ich ging ja davon aus das Du das setzen von `c` auf eine *Liste* schon mal nicht-animiert ausprobiert hast, aber das geht grundsätzlich nicht. Die Dokumentation von `plot()` ist da eigentlich auch recht deutlich das dort *ein* Farbwert für die *Linie* erwartet wird. Das was Du `point` genannt hast ist ein `Line2D`-Exemplar. Ist etwas irreführend das `point` zu nennen.
Was Du wahrscheinlich möchtest ist ein `scatter()`-Plot. *Da* sagt die Dokumentation nämlich das man auch eine Sequenz von Farben angeben kann.
Was Du wahrscheinlich möchtest ist ein `scatter()`-Plot. *Da* sagt die Dokumentation nämlich das man auch eine Sequenz von Farben angeben kann.