我正在寻找一种方法来为matplotlib中的线条图分配 colored颜色 ,这种方式可以响应线条的Angular .这是我当前的代码:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
horz = [[0.5,0.6,0.8],[0.1,0.8,0.9],[0.2,0.5,0.9]] 
vert = [[0.1,0.2,0.3],[0.05,0.1,0.15],[0.2,0.3,0.35]]

f = plt.figure(figsize=(6,6))
ax = plt.axes()

for column in range(0,len(horz)):
    x = np.array(horz[column])
    y = np.array(vert[column])
            
    #LINEAR TRENDLINE
    z = np.polyfit(horz[column], vert[column], 1)
    p = np.poly1d(z)
    ax.plot(horz[column],p(horz[column]),"-")
    plt.arrow(x=horz[column][-2],y=p(horz[column])[-2],dx=(horz[column][-1]-horz[column][-2]),dy=(p(horz[column])[-1]-p(horz[column])[-2]), shape='full', lw=.01,
              length_includes_head=True, head_width=.012, head_length=0.02, head_starts_at_zero=False, overhang = 0.5)
            
    #FIG SETTINGS
    plt.xlim([0, 1])
    plt.ylim([0.1,0.5])
    ax.set_title('Title',
             fontsize = 14)

As it is now, the colors are randomly assigned

这里的 idea 是,如果直线在0度,它将在给定渐变的一端,如果它在90度,则在另一端.另外,我想把线条的长度作为 colored颜色 的强度.所以如果这条线很短,它会更接近白色,如果这条线很长,它会更接近渐变中的原始 colored颜色 .

推荐答案

我自己设法解决了.使用非常简单的公式来计算线的斜率和距离,然后使用这些公式作为 colored颜色 映射和Alpha透明度属性的输入.

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.colors as colors
import numpy as np

%matplotlib inline

#Data
horz = [[0.5,0.6,0.8],[0.1,0.3,0.4],[0.2,0.5,0.9],[0.9,0.95,0.95]] 
vert = [[0.1,0.2,0.45],[0.05,0.1,0.15],[0.2,0.3,0.35],[0.1,0.3,0.5]]
            

#Slope calculation
def slopee(x1,y1,x2,y2):
        x = (y2 - y1) / (x2 - x1)
        return x

#Color set up
cmap = plt.cm.coolwarm_r
#0 means a horizontal line, 1 means a line at 45 degrees, infinite means a vertical line (2 is vertical enough)
cNorm  = colors.Normalize(vmin=0, vmax=2)
scalarMap = cm.ScalarMappable(norm=cNorm,cmap=cmap)

#Fig settings
f = plt.figure(figsize=(6,6))
ax = plt.axes()


for column in range(0,len(horz)):
    x = np.array(horz[column])
    y = np.array(vert[column])
    
    #LINEAR TRENDLINE
    # 1   LINEAR
    # >=2 POLINOMIAL
    z = np.polyfit(horz[column], vert[column], 1)
    p = np.poly1d(z)
    
    #Distance calc formula
    def calculateDistance(x1,y1,x2,y2):
        dist = np.sqrt((x2 - x1)**2 + (y2 - y1)**2)
        return dist
    
    #Set up max an min distances
    maxdist = calculateDistance(0,0,0,0.9)
    mindist = calculateDistance(0,0,0,0)
    
    #Calculate line slope
    slope = slopee(horz[column][0],p(horz[column])[0],horz[column][-1],p(horz[column])[-1])
    
    #Not interested in any slopes going "down"
    if slope >=0:
        #Map colors based on slope (0-2)
        colorVal = scalarMap.to_rgba(slope)
        #Map transparency based on distance
        transparency = (calculateDistance(horz[column][0],p(horz[column])[0],horz[column][-1],p(horz[column])[-1])-mindist)/(maxdist-mindist)
        #Set up minimun transparency to be 50% instead of 0%
        transparency = (0.5*transparency) + 0.5
        #The actual arrow plot
        plt.arrow(x=horz[column][0],y=p(horz[column])[0],dx=(horz[column][-1]-horz[column][0]),dy=(p(horz[column])[-1]-p(horz[column])[0]), shape='full',length_includes_head=True, head_starts_at_zero=False, lw=.5, head_width=.011, head_length=0.01, overhang = 0.5, color=colorVal,alpha=transparency)

    #FIG SETTINGS
    plt.xlim([0, 1])
    plt.ylim([0,0.5])
    ax.set_title('Title',fontsize = 14)

Color hue and intensity vary with slope and length

Python相关问答推荐

pandas:在操作pandora之后将pandora列转换为int

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

如何在PythonPandas 中对同一个浮动列进行逐行划分?

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

Django更新视图未更新

如何将django url参数传递给模板&S url方法?

将时间序列附加到数据帧

Sknowled线性回归()不需要迭代和学习率作为参数

这是什么排序算法?(将迭代器与自身合并&&Q;)

如何强制SqlalChemy指向与连接字符串的默认架构不同的架构

基于符号和位置 Select 数据帧特定区域的毕达式方法

Regex模式在Python中不起作用,但在RegExr上?

如何绘制时间尺度不均匀的时间序列

Pandas 中的每行布尔运算

用Gekko拟合两个总体的测量值

如何才能将文本文件分成多列,但仅限于特定的行?

SCRIT-学习定制转换器从底层模型抛出NotFittedError

使用Python下载文件时出现错误699

为什么一些地块有网格线,而另一些地块没有网格线?