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.

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.
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.

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


0