Вывод нескольких значений на один ключ в python - PullRequest
2 голосов
/ 29 мая 2020

Я пытаюсь построить диаграмму рассеяния с помощью этого словаря

d = {1: [1, 2, 3, 4, 5], 3: [3, 6, 9, 12, 15], 5: [5, 10, 15, 20, 25]}

Я хочу, чтобы ключи были на оси X, а значения - на оси Y, а также чтобы показать легенду с разные ключевые значения. Я пробовал этот код -

import matplotlib.pyplot as plt

d = {1: [1, 2, 3, 4, 5], 3: [3, 6, 9, 12, 15], 5: [5, 10, 15, 20, 25]}
colors = list("rgbk")
x, y =[], []
for i in d.keys():
   for j in d[i]:
       x.append(i)
       y.append(j)
   plt.scatter(x, y, color = colors.pop())
   plt.legend(d.keys())
plt.show()

Но это дает мне график с точками только одного цвета, но легенды в порядке.

This is the output image that I am getting

Ответы [ 3 ]

3 голосов
/ 29 мая 2020

В этом случае лучше использовать plt.subplots(), чтобы вы могли повторно использовать тот же axis. Итерация цвета предоставляется бесплатно, но я оставил ее, не уверен, что вы предпочитаете rgbk.

По возможности избегайте циклов for в Python для лучшей читаемости и производительности.

import matplotlib.pyplot as plt

d = {1: [1, 2, 3, 4, 5], 3: [3, 6, 9, 12, 15], 5: [5, 10, 15, 20, 25]}
colors = list("rgbk")

fig, ax = plt.subplots()

for x, ys in d.items():
    ax.scatter([x] * len(ys), ys, color = colors.pop(), label=x)

plt.legend()
plt.show()

plot

Если вы имеете дело с большими массивами, подумайте об использовании numpy. В этом случае вы можете изменить масштаб key, например, следующим образом:

import matplotlib.pyplot as plt
import numpy as np

d = {1: [1, 2, 3, 4, 5], 3: [3, 6, 9, 12, 15], 5: [5, 10, 15, 20, 25]}
colors = list("rgbk")

fig, ax = plt.subplots()

for x, ys in d.items():
    ax.scatter(np.full_like(ys, x), ys, color = colors.pop(), label=x)

plt.legend()
plt.show()
2 голосов
/ 29 мая 2020

Вы инициализируете списки x и y перед l oop. На каждой итерации вы добавляете новые значения в список, и они перекрашивают старые точки. Переместите строку x, y =[], [] в l oop.

0 голосов
/ 29 мая 2020

Вот способ:

import matplotlib.pyplot as plt

d = {1: [1, 2, 3, 4, 5], 3: [3, 6, 9, 12, 15], 5: [5, 10, 15, 20, 25]}

for i in d.keys():
   for j in d[i]:
       plt.scatter(i,j,color=(i/10,i/10,i/10))
   plt.legend(d.keys())
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...