Python - Cambiar colores a elementos de una gráfica

 
Vista:
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Cambiar colores a elementos de una gráfica

Publicado por Juan (14 intervenciones) el 17/03/2021 12:38:51
Buenas tardes. Tengo este código que me devuelve este resultado:
Solución: [(3, 0), (3, 2), (4, 1), (4, 3), (4, 4)]
Es un problema de localizaciones en el que genero una gráfica con ejes que van de 0 a 100, que simulan ser coordenadas. A su vez, genero puntos aleatorios en dicha gráfica, tantos como plants y customers tengo (en este caso 5 de cada. Rojos: plants, azules: customers.
En la solución tengo por ejemplo que: (3, 0), (3, 2). Es decir que a la planta con nombre 3 van los customers numero 0 y 2, y en el gráfico se puede ver que hay un punto rojo que va hacia dos azules. Y lo mismo para: (4, 1), (4, 3), (4, 4): A la planta 4 van los customers 1,3,4.
SDbuc
Me gustaría saber cómo puedo hacer que las líneas que salen de un mismo punto sean iguales pero distintas a las que salgan de otro, es decir, por ejemplo, que las línas que salen de 3 hacia 0 y 2 sean de un mismo color (por ejemplo verde) pero las lineas que salen de 4 hacia 1,3,4 sean de distinto color que las de 3. A su vez, también me gustaría saber si es posible hacer que los puntos que no tengan líneas tengan un color distinto (por ejemplo, negro). No sé si será posible hacer algo de lo que comento.
Gracias de antemano.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
dimension = random.randint(2,5)
    plants  = range(dimension)
    customers = range(dimension)
    n=dimension
 
 
    random.seed(len(customers))
    customers_points   = [(random.randint(0,100),random.randint(0,100)) for j in customers]
    plants_points = [(random.randint(0,100),random.randint(0,100)) for i in plants]
 
######################################################################### GRAPH FUNCTION #################################################################
 
import matplotlib.pyplot as plt
def draw(selected):
    #We generate ramdonly production plants locations
 
    plt.plot([p[0] for p in plants_points], [p[1] for p in plants_points], 'ro')
    plt.plot([p[0] for p in customers_points], [p[1] for p in customers_points], 'bs')
 
    for (i,j) in selected:
        plt.plot([plants_points[i][0],customers_points[j][0]], [plants_points[i][1],customers_points[j][1]], 'g-')
 
    plt.xlabel("X coordinate")
    plt.ylabel("Y coordinate")
 
draw({})
 
######################################################################### USUAL DISTANCE FUNCTION #################################################################
 
import math
def distance(points, i, j):
    dx = points[i][0] - points[j][0]
    dy = points[i][1] - points[j][1]
    return math.floor(math.sqrt(dx*dx + dy*dy)*random.uniform(1.0, 1.2))
 
 
######################################################################### COSTS ARRAYS #################################################################
    cost  = [[random.randint(1,100) for i in plants] for j in customers]
    fcost = [random.randint(1,100) for i in plants]
 
 
 
solver = pywraplp.Solver('UncapacitatedFacilityLocationProblem', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) #we use this one because it is free
 
###################################################################### DECISION VARIABLES #################################################################
 
x = { (i,j) : solver.BoolVar('x[%i, %i]' % (i, j)) for i in plants for j in customers} #Boolean variable is a variable which values are 0 or 1
y = { i : solver.BoolVar('y[%i]' % (i)) for i in plants }
#Remember that %i is to show integer value
 
############################################################################# MODEL #############################################################################
 
solver.Minimize(solver.Sum(fcost[i] * y[i] for i in plants) + solver.Sum(cost[i][j] * x[i,j] for i in plants for j in customers))
 
############################################################################# RESTRICTIONS #############################################################################
#Now we are going to write the restrictions into brackets because we have more than one
 
[ solver.Add(solver.Sum(x[i,j] for i in plants) == 1)  for j in customers ]
for i in plants:
    [ solver.Add(y[i] <= 1)  ]
    for j in customers:
        [ solver.Add(x[i,j] <= y[i]) ]
        [ solver.Add(0 <= x[i,j]) ]
[ solver.Add(y[i] <= 1)  ]
 
solver.Solve()
 
print('Total cost = ', solver.Objective().Value()," euros ")
selected = [(i,j) for i in plants for j in customers if x[i,j].solution_value() > 0.5]
 
print('Optimal path: %s' % str(selected))
draw(selected)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 3.475
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Cambiar colores a elementos de una gráfica

Publicado por joel (901 intervenciones) el 18/03/2021 19:26:40
Hola Juan, te contesto lo que te he comentado en el chat... por si algún usuario tiene el mismo problema.

La manera que se me ocurre, es que en cada plot() le pases el color...
algo así:
1
plt.plot([p[0] for p in plants_points], [p[1] for p in plants_points], 'bs', color="....")

Pero si quieres especificar un color dependiendo de algún valor, tendrás que hacerlo manualmente y poner el color que desees según condición que tu tienes que gestionar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Cambiar colores a elementos de una gráfica

Publicado por Juan (14 intervenciones) el 18/03/2021 21:10:11
Gracias por tu ayuda. Al final creé una lista de colores y según el valor de i la recorría.
Para no tener que copiar de nuevo el código en otro post, tenía la duda de cómo aumentar el tamaño de la gráfica. He usado:
1
plt.figure(figsize=(20,12))
Efectivamente me amplía el tamaño de la gráfica pero me crea dos: una con las líneas entre puntos y cuadrados y otro sin las líneas, y yo solo quiero que me cree la que tiene líneas. ¿Por qué sucede esto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar