pandas 从 Python 中的颜色字典绘制不同颜色的线条

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19488930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 21:15:41  来源:igfitidea点击:

Plot lines in different colors from color dictionary in Python

pythonmatplotlibpandasmatplotlib-basemap

提问by mikez1

I'm trying to plot the path of 15 different storms on a map in 15 different colors. The color of the path should depend on the name of the storm. For example if the storm's name is AUDREY, the color of the storm's path should be red on the map. Could some please help/point me in the right direction?

我试图用 15 种不同颜色在地图上绘制 15 种不同风暴的路径。路径的颜色应取决于风暴的名称。例如,如果风暴的名称是 AUDREY,则风暴路径的颜色在地图上应为红色。有些人可以帮助/指出我正确的方向吗?

Here's the part of my code:

这是我的代码的一部分:

import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import csv, os, scipy
import pandas
from PIL import *


data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=1)
'''print data'''
fig = plt.figure(figsize=(12,12))

ax = fig.add_axes([0.1,0.1,0.8,0.8])

m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57.,
            projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60.,
            resolution ='l',area_thresh=1000.)

m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)

# Creates parallels and meridians
m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
m.drawmapboundary(fill_color='aqua')
color_dict = {'AUDREY': 'red', 'ETHEL': 'white', 'BETSY': 'yellow','CAMILLE': 'blue', 'CARMEN': 'green',
'BABE': 'purple', 'BOB': '#ff69b4', 'FREDERIC': 'black', 'ELENA': 'cyan', 'JUAN': 'magenta', 'FLORENCE': '#faebd7',
'ANDREW': '#2e8b57', 'GEORGES': '#eeefff', 'ISIDORE': '#da70d6', 'IVAN': '#ff7f50', 'CINDY': '#cd853f',
'DENNIS': '#bc8f8f', 'RITA': '#5f9ea0', 'IDA': '#daa520'}

# Opens data file witn numpy
'''data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=0)'''
'''print data'''
colnames = ['Year','Name','Type','Latitude','Longitude']
data = pandas.read_csv('louisianastormb.csv', names=colnames)
names = list(data.Name)
lat = list(data.Latitude)
long = list(data.Longitude)
colorName = list(data.Name)
#print lat
#print long
lat.pop(0)
long.pop(0)
latitude= map(float, lat)
longitude = map(float, long)
x, y = m(latitude,longitude)
#Plots points on map
for colorName in color_dict.keys():
    plt.plot(x,y,'-',label=colorName,color=color_dict[colorName], linewidth=2 )
    lg = plt.legend()
    lg.get_frame().set_facecolor('grey')
plt.title('20 Hurricanes with Landfall in Louisiana')
#plt.show()
plt.savefig('20hurpaths1.jpg', dpi=100)

Here's the error message that I keep getting is:

这是我不断收到的错误消息:

Traceback (most recent call last):                                                                                 
    File "/home/mikey1/lstorms.py", line 51, in <module>                                                          
    plt.plot(x,y,'y-',color=colors[names], linewidth=2 )                                                           
   TypeError: unhashable type: 'list'                                                                                 
 >>> 

采纳答案by Aleksander Lidtke

You're accessing the dictionary entries incorrectly. First off you do this names = list(data.Name). So names is of type lists. Then you call dictionary like this: color_dict[names]. The problem is not setting the colour but how you try to access the dictionary (listis not a valid key).

您访问的字典条目不正确。首先你这样做names = list(data.Name)。所以 names 的类型是lists。然后调用词典是这样的:color_dict[names]。问题不在于设置颜色,而在于您尝试访问字典的方式(list不是有效键)。

Change it to something like:

将其更改为:

for colourName in color_dict.keys():
     plt.plot(x,y,'y-',color=color_dict[colourName], linewidth=2 ) # You need to use different data for the data series here.

And it'll work.

它会起作用。

Also, your error message reads plt.plot(x,y,'y-',color=colors[names], linewidth=2 )but in your code you've got color=colors_dict[names]. Are you sure you posted the right code?

此外,您的错误消息会读取,plt.plot(x,y,'y-',color=colors[names], linewidth=2 )但在您的代码中,您有color=colors_dict[names]. 你确定你发布了正确的代码?