поэтому я недавно узнал о визуализации данных после просмотра прохладного видеоролика Numberphile, я хотел сделать свою собственную небольшую визуализацию данных со случайными числами. Идея состоит в том, что у меня есть список случайных чисел, и в зависимости от числа я рисую другой цветной круг. Цветной ключ объясняется в приведенном ниже коде.
Однако у меня, похоже, есть логическая проблема с моим кодом. Код работает без ошибок, но на основе того, что я описал ранее, моя программа работает некорректно. Во-первых, в моем списке есть 10 целых чисел, но только 6 нарисованы на программе. Кроме того, окраска немного выключена. Любая помощь приветствуется, спасибо.
import pygame
pygame.init()
## COLOR KEY
# 0 - Black
# 1 - White
# 2 - Red
# 3 - Orange
# 4 - Yellow
# 5 - Green
# 6 - Blue
# 7 - Indigo
# 8 - Violet
# 9 - dark blue
display_width = 1000
display_height = 500
display = pygame.display.set_mode((display_width,display_height))
black = 0,0,0
white = 255,255,255
red = 255,0,0
orange = 255,165,0
yellow = 255,255,0
green = 0,255,0
blue = 0,0,255
indigo = 29,0,51
violet = 128,0,128
darkblue = 0,200,0
random_list = [9,8,5,9,4,7,5,1,9,0]
def programLoop():
exitProgram = False
while not exitProgram:
for evt in pygame.event.get():
if evt.type == pygame.QUIT:
pygame.quit()
quit()
startN = 100
display.fill(white)
for n in random_list:
color = black
if random_list[n] == 0:
color = black
if random_list[n] == 1:
color = white
if random_list[n] == 2:
color = red
if random_list[n] == 3:
color = orange
if random_list[n] == 4:
color = yellow
if random_list[n] == 5:
color = green
if random_list[n] == 6:
color = blue
if random_list[n] == 7:
color = indigo
if random_list[n] == 8:
color = violet
if random_list[n] == 9:
color = darkblue
pygame.draw.circle(display,color,[n * 50 + startN,250],10)
pygame.display.update()
programLoop()
Первым шагом для отладки программы будет печать n, color, n*50 + startN
. Вы увидите, что вы random_list
индексы в random_list
не по диапазону, как вы ожидаете. Таким образом, первое число равно 9, вы проверяете, является if random_list[9] == 0
, True
и устанавливает color = black
и отображает его на уровне 550.
Вы можете перебирать диапазон for n in range(len(random_list)):
для устранения этой проблемы.
Я предлагаю помещать цвета в список или словарь и просто перебирать перечислимый random_list
. Затем вы получаете число n
и индекс цвета одновременно и можете просто получить доступ к цвету следующим образом: color = colors[color_index]
.
Обновленный код:
darkblue = 0,0,200 # Your darkblue was green.
# Put the colors into a list.
colors = [black, white, red, orange, yellow, green, blue, indigo, violet, darkblue]
random_list = [9,8,5,9,4,7,5,1,9,0]
def programLoop():
clock = pygame.time.Clock() # A clock to limit the frame rate.
exitProgram = False
while not exitProgram:
for evt in pygame.event.get():
if evt.type == pygame.QUIT:
exitProgram = True
startN = 100
display.fill((200, 200, 200))
# Now enumerate the list, so that you'll get n and the color index
# at the same time.
for n, color_index in enumerate(random_list):
color = colors[color_index]
pygame.draw.circle(display, color, [n*50 + startN, 250], 10)
pygame.display.update()
clock.tick(60) # Limit the frame rate to 60 FPS.
programLoop()
pygame.quit()
for
с двумя переменными, найдите «распаковка кортежей» или «повторяемая распаковка».