Как создать диаграмму рассеяния с различными размерами и цветом рассеяния, соответствующими диапазону значений из кадра данных? - PullRequest
1 голос
/ 06 ноября 2019

У меня есть Dataframe

df = 
Magnitude,Lon,Lat,Depth
3.5  33.3   76.2    22
3.5  33.1   75.9    34
2.5  30.5   79.6    25
5.5  30.4   79.5    40
5.1  32     78.8    58
4.5  31.5   74      NaN
2.1  33.9   74.7    64
5.1  30.8   79.1    33
1.1  32.6   78.2    78
NaN  33.3   76      36
5.2  32.7   79.5    36
NaN  33.6   78.6    NaN

Я хотел сделать график рассеяния с Lon по оси X Lat по оси Y и точками рассеяния с различным размером в соответствии с диапазоном значений в Magnitude;

size =1 : Magnitude<2 ,  size =1.5 : 2<Magnitude<3,  size =2 : 3<Magnitude<4,  size =2.5 : Magnitude>4.

и с другим цветом в зависимости от диапазона значений в глубине;

 color =red : Depth<30 ,  color =blue : 30<Depth<40,  color =black : 40<Depth<60,   color =yellow : Depth>60

Я думаю решить эту проблему, определив словарь для размера и цвета. (Просто даю идею; нужен правильный синтаксис)

Больше похоже на

def magnitude_size(df.Magnitude):
    if df.Magnitude < 2 :
        return 1
    if df.Magnitude > 2 and df.Magnitude < 3 :
        return 1.5
    if df.Magnitude > 3 and df.Magnitude < 4 :
        return 2
    if df.Magnitude > 4  :
        return 2.5


def depth_color(df.Depth):
    if df.Depth < 30 :
        return 'red'
    if df.Depth > 30 and df.Depth < 40 :
        return 'blue'
    if df.Depth > 40 and df.Depth < 60 :
        return 'black'
    if df.Depth > 60  :
        return 'yellow'


di = {
    'size': magnitude_size(df.Magnitude),
    'color' : depth_color(df.Depth)
}

plt.scatter(df.Lon,df.Lat,c=di['color'],s=di['size'])

plt.show()

Если есть какие-либо значения NaN в Magnitude, дают другойсимвол для точки разброса () и, если есть какие-либо значения NaN в глубине, дают другой цвет (зеленый) *

NEED HELP

1 Ответ

1 голос
/ 06 ноября 2019

Вы можете использовать pandas.cut для создания пары вспомогательных столбцов в df на основе ваших color и size отображений. Это должно упростить передачу этих аргументов pyplot.scatter.

Примечание. Следует отметить, что значения, выбранные вами для размера, могут не очень хорошо различать маркеры всюжет - стоило бы поэкспериментировать с разными размерами, пока не получите желаемые результаты

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df['color'] = pd.cut(df['Depth'], bins=[-np.inf, 30, 40, 60, np.inf], labels=['red', 'blue', 'black', 'yellow'])
df['size'] = pd.cut(df['Magnitude'], bins=[-np.inf, 2, 3, 4, np.inf], labels=[1, 1.5, 2, 2.5])

plt.scatter(df['Lon'], df['Lat'], c=df['color'], s=df['size'])

enter image description here


Обновление

Это не то, что я бы рекомендовал, но если вы настаиваете на использовании dict и functions, тогда используйте:

def magnitude_size(magnitude):
    if magnitude < 2 :
        return 1
    if magnitude >= 2 and magnitude < 3 :
        return 1.5
    if magnitude >= 3 and magnitude < 4 :
        return 2
    if magnitude >= 4  :
        return 2.5


def depth_color(depth):
    if depth < 30 :
        return 'red'
    if depth >= 30 and depth < 40 :
        return 'blue'
    if depth >= 40 and depth < 60 :
        return 'black'
    if depth >= 60  :
        return 'yellow'
    if np.isnan(depth):
        return 'green'

di = {
    'size': df.Magnitude.apply(magnitude_size),
    'color' : df.Depth.apply(depth_color)
}

plt.scatter(df.Lon,df.Lat,c=di['color'],s=di['size'])
...