2017-04-01 5 views
0

Im folgenden versuche ich Punkte mit Farbe und Beschriftung zu plotten, die sich für jedes j ändert. Was ich immer ist andere Farbe und ein Label in der Legende für jedes Paar (i, j):Beschriftungsbereiche und Farben in Python Plot

import itertools 
import numpy as np 
import matplotlib.pyplot as plt 

color_list = ["blue", "brown", "red", "black"] 
g = itertools.cycle(color_list) 

primes = (139,149,151,157,163,167) 
for j in range(50, 300, 10): 
    col = next(g) 
    for k in (primes): 
     for l in range(10000, 20000, 500): 
      start = time.time() 
      generator(j, k, l) 
      end = time.time() 
      plt.plot(l, end - start, linewidth = 2, marker='o', color=col) 

Edit: den Code mit meinem ursprünglichen Problem aktualisiert, da ich nicht herausfinden können, wenn die Lösung von Ernest + Arya kann in diesem Fall funktionieren.

Antwort

1

Ist nicht die zweite Schleife über i ziemlich nutzlos?

import numpy as np 
import matplotlib.pyplot as plt 

for j in range (0, 2): 
    x = np.arange(0,9,2) 
    y = np.ones_like(x)*j + 0.5 
    plt.plot(x,y, marker='o', label='$n = {j}$'.format(j=j)) 

plt.legend()  
plt.show() 

enter image description here

Lösung für aktuelle Frage:

import itertools 
import numpy as np 
import matplotlib.pyplot as plt 

color_list = ["blue", "brown", "red", "black"] 
g = itertools.cycle(color_list) 

for j in range (0, 2): 
    col = next(g) 
    x = np.arange(0,9,2) 
    y = np.ones_like(x)*j + 0.5 
    plt.plot(x,y, marker='o', color=col, label='$n = {j}$'.format(j=j)) 
plt.legend() 
plt.show() 

enter image description here

Lösung für die zweite Aktualisierung; Die Idee ist immer die gleiche: Verwenden Sie so viele Aufrufe an plt.plot(), wie Sie verschiedene Farben/Legende Einträge haben möchten.

import numpy as np 
import matplotlib.pyplot as plt 
import time 

def generator(j,k,l): 
    #some operation that takes a little time 
    a = np.random.rand(k % 7, l-1000, j%13) 
    return a 

color_list = ["blue", "brown", "red", "black"] 

primes = (139,149,151,157,163,167) 
for j in range(50, 300, 25): 
    x = []; y = [] 
    for k in (primes): 
     for l in range(10000, 20000, 1000): 
      start = time.time() 
      generator(j, k, l) 
      end = time.time() 
      x.append(l); y.append(end - start) 
    plt.plot(x,y, ls="", marker='o', label='$n = {j}$'.format(j=j)) 

plt.legend() 
plt.show() 

enter image description here

+0

Ich stimme zu, aber es war nur ein vereinfachtes Beispiel für zwei oder mehr geschachtelten Schleifen, nicht unbedingt mit diesen Punkten zu plotten. –

+0

Sicher, aber die gleiche Strategie gilt für eine beliebige Anzahl von Plots. Benutze einfach nicht die innere "i" -Schleife. (Dies gilt auch für die bearbeitete Frage.) – ImportanceOfBeingErnest

+0

Noch ein Update für die zweite Bearbeitung. – ImportanceOfBeingErnest

1

Sie können die Matplotlib cycler verwenden. Richten Sie die Liste der Farben ein, die Sie durchlaufen möchten, und geben Sie in der j-Schleife eine Farbe mit my_cycle.next() ein. Übergeben Sie diese Farbe dann an Ihren Anruf an plt.plot.

+0

Ist es ähnlich wie 'itertools.cycle()'? –

+0

Ja - es beruht auf 'itertools.cycle()' und fügt etwas zusätzliche Selbsterfahrung, wie seine Länge hinzu. –

1

können Sie sin verwenden oder cos-Funktionen Farbwahl zu steuern und eine Variable hinzufügen, die nur dann, wenn j Änderungen ändert sich steuern, ob Sie ein neues Label plotten

import numpy as np 
import matplotlib.pyplot as plt 
import math 

last_j = -1 
z = 5 
for j in range (0, z): 
    color = ((math.sin(j)+1)/2,(math.cos(j+1)+1)/2,(math.cos(j)+1)/2) 
    for i in range (0, 10, 2): 
     if j == last_j: 
      plt.plot(i + 0.5, j + 0.5, c=color, linewidth = 2, marker='o') 
     else: 
      plt.plot(i + 0.5, j + 0.5, c=color, linewidth = 2, marker='o', 
       label='$n = {j}$'.format(j=j)) 
     last_j = j 

ax = plt.gca() 
legend = ax.legend(loc = 'center right', shadow=True) 

plt.show() 

enter image description here