Farbvektor an Plot-Befehl übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlackJack

@mcatis: Weil Du immer noch den gleichen Fehler machst: Ein Array mit einem Element ist nicht das gleiche wie ein Element.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Code: Alles auswählen

for i range(len(data)):
    data[i] ...
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 Leben ist wie ein Tennisball.
mcatis
User
Beiträge: 20
Registriert: Donnerstag 29. August 2013, 01:11
Wohnort: Köln

Also so klappt's:

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')
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.
BlackJack

@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.
mcatis
User
Beiträge: 20
Registriert: Donnerstag 29. August 2013, 01:11
Wohnort: Köln

Gut, danke. Mit einem scatter funktioniert es dann auch.

Lieben Dank für eure Hilfe.
Antworten