【问题标题】:Plot lines in different colors from color dictionary in Python从 Python 中的颜色字典绘制不同颜色的线条
【发布时间】:2013-10-21 07:54:16
【问题描述】:

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

这是我的代码的一部分:

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)

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

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

【问题讨论】:

    标签: python matplotlib pandas matplotlib-basemap


    【解决方案1】:

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

    将其更改为:

    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.
    

    它会起作用的。

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

    【讨论】:

    • 哦,好的。抱歉,我是这方面的新手。我只是看了一些关于 python 字典的例子,但它仍然令人困惑。对于我正在尝试做的事情,访问字典的最佳方式是什么?
    • 非常感谢!!!很抱歉代码是相同的,但我只是将其从 color 更改为 color_dict 以保持所有内容的唯一性。
    • 别担心,伙计。为了将来参考,最好使用type &lt;int&gt;type &lt;str&gt; 的密钥。还有一个简单的例子,如何以编程方式访问我的答案中的字典条目。它现在有效吗?如果不使用新问题更新问题,如果您接受答案会很好。
    • 非常感谢!!!我终于摆脱了那个错误。但是这些线条没有显示在我的地图上。有没有办法解决这个问题?
    • 你能把你的整个代码贴出来(包括导入语句等)吗?
    猜你喜欢
    • 2023-03-19
    • 2011-01-02
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多