Matplotlib色彩映射,散点图传递颜色的第三个变量:无效的RGBA参数

时间:2017-08-14 08:47:33

标签: python matplotlib plot scatter-plot

我们正在构建关于matplotlib的报告。每个页面都有多个图表和一些文本。

在报告数据中有超过100个位置,每个位置都有密度。我们的想法是在地图上绘制点,其中颜色(红色阴影)代表位置的密度。

但是,我不理解ax.scatter调用中kwargs:c和cmap之间的联系,也不理解color.Normalize在这个应用程序中的作用。

import pandas as pd
import matplotlib
import numpy as np
from pandas import Series, DataFrame
import csv
from scipy import stats
import matplotlib.pyplot as plt
import random
import matplotlib.colors as colors

# Get the data and transform
data = pd.read_csv('logHistThis.csv')
data.drop('Unnamed: 0', axis=1, inplace=True)
dataMean = data['Density'].mean()
data = list(data['Density'])

# I was under the impresion that the data for the colormap
# had to be between 1 and 0 so did this:
aColorScale = []
def myColorScale(theData):
    aColorScale = []
    for x in theData:
        this = x/100
        aColorScale.append(this)
    return aColorScale

aColorScale = myColorScale(data)

estimated_mu, estimated_sigma = stats.norm.fit(data)
xmin = min(data)
xmax = max(data)
x = np.linspace(xmin, xmax, 100)
pdf = stats.norm.pdf(x, loc=estimated_mu, scale=estimated_sigma)

thisRangeMin = np.log(27)
thisRangeMax = np.log(35)

q = [np.random.choice(data, 40)]
z = [ np.random.randint(1, 50, size=40)]
s = 100 *q


colormap = 'Reds'
normalize =matplotlib.colors.Normalize(vmin=xmin, vmax=xmax)
#plt.scatter(x,y,z,s=5, cmap=colormap, norm=normalize, marker='*')


fig = plt.figure(figsize=(10, 5), frameon=False, edgecolor='000000', linewidth = 1)

rect0 = .05, .05, .4, .9
rect1 = .5, .05, .4, .9

# This works great 
ax1 = fig.add_axes(rect0)#<-----------x2TopTenSummary
ax1.hist(data, bins=13, normed=True, color='c', alpha=0.05)
#ax1.fill_between(x, pdf, where=(), alpha=.2)
ax1.fill_between(x, pdf, where=((x <  thisRangeMax) & ( x > thisRangeMin)), alpha=.2, label='City Range')
ax1.vlines(dataMean, 0,  stats.norm.pdf(dataMean, loc=estimated_mu, scale=estimated_sigma), color='r')
ax1.plot(x, pdf, 'k')

# This does not work :
# It just gives blue dots
ax2= fig.add_axes(rect1)
ax2= fig.add_axes(rect1)
ax2.scatter(q,z, s=200,  cmap= 'Reds',norm=matplotlib.colors.Normalize(vmin=min(aColorScale) , vmax=max(aColorScale)))

# Tried to set the color map in a variety of ways:
# When kwarg 'c' is set to the variable 'aColorScale' i get the error

plt.show()
plt.close()

所以我的问题是如何将colormap合并到这种类型的应用程序中?

具有预定尺寸(A4或字母)的图形上的多个轴。 颜色确定是第三个变量z,(不是x或y) 颜色决定因素是浮点数,其中0 <0。 z&lt; 8 这个电话是斧头而不是电话

我不清楚文档中的应用程序说明:

axes.scatter的文档 color.normalize

的文档

我见过很多例子,图中只有一个斧头,调用是plt.scatter ...例如here

在我们的情况下,x,y将是经度,lattitude,变量是'data',是0到8之间的浮点数列表或数组。

由于

2 个答案:

答案 0 :(得分:1)

好的答案来自Tamir Lousky撰写的this文件中的PyCon Israel 2017。

数据的规范化以及与颜色映射的关联发生在这个代码块中:

aColorScale = data
aColorScale = np.array(aColorScale)
norm = (aColorScale - aColorScale.min())/(aColorScale.max() - aColorScale.min())
cmap= plt.get_cmap('Reds')
colors = [cmap(tl) for tl in norm]#<---- thisRightHere

然后颜色被送入ax2:

ax2= fig.add_axes(rect1)
ax2.scatter(q,z, s=200, color = colors)

我希望那些低估我的问题的人会说为什么,有几个小时的搜索并试图找到这个。

无论如何这是最终的形象:

enter image description here

答案 1 :(得分:0)

虽然我在理解问题本身时遇到了问题,但我可以告诉您,您在答案中的解决方案可以简化为绘制散点图的常用方法:

ax2= fig.add_axes(rect1)
ax2.scatter(q,z, c=aColorScale, s=200, cmap='Reds')