web-dev-qa-db-ja.com

pandasデータフレームとは異なるサイズ、マーカー、色の散布図

マーカーがさまざまなタイプを示し、サイズがさまざまな重みを示し、色が10分を超えるポイントの古さを示す各ポイントについて、メートルを超える速度で散布図を作成しようとしています。しかし、これまではサイズでしかプロットできませんでした。

どんな助けでも大歓迎です。

x = {'speed': [10, 15, 20, 18, 19], 'meters' : [122, 150, 190, 230, 300], 'type': ['phone', 'phone', 'gps', 'gps', 'car'], 'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 'old': [1, 2, 4, 5, 8]}

m = pd.DataFrame(x)

plt.scatter(m.meters, m.speed, s = 30* m.weight)

mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}

   meters  speed   type  weight  old
0     122     10  phone    0.20    1
1     150     15  phone    0.30    2
2     190     20    gps    0.10    4
3     230     18    gps    0.85    5
4     300     19    car    0.00    8

更新された質問:

古いものに基づいてカラースケールにカラーバーを追加しようとしています。データセット全体に対してプロットすると機能しましたが、サブセットごとにマーカーを追加しようとすると失敗しました。何か案が?

plt.scatter(m.meters, m.speed, s = 30* m.weight, c=m.old)
cbar = plt.colorbar(ticks = [0, 5, 10])
cbar.ax.set_yticklabels(['New','5mins', '10mins'])

TypeError:最初にmappableのset_arrayを行う必要があります

6
Kexin Xu

scatterは一度に1種類のマーカーしか実行できないため、異なるタイプを別々にプロットする必要があります。幸いなことにpandasはこれを簡単にします:

import matplotlib.pyplot as plt
import pandas as pd
x = {'speed': [10, 15, 20, 18, 19],
     'meters' : [122, 150, 190, 230, 300],
     'type': ['phone', 'phone', 'gps', 'gps', 'car'],
     'weight': [0.2, 0.3, 0.1, 0.85, 0.0],
     'old': [1, 2, 4, 5, 8]}

m = pd.DataFrame(x)
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}
for kind in mkr_dict:
    d = m[m.type==kind]
    plt.scatter(d.meters, d.speed, 
                s = 100* d.weight, 
                c = d.old, 
                marker = mkr_dict[kind])
plt.show()

enter image description here

....車はどこですか?さて、元のテストデータでは重みは0.0であり、マーカーサイズに重みを使用しているため、表示されません。

13
cphlewis

ここにあるように、ポイントが少ししかない場合は、floatのリストをc引数に渡すことができます。

colors = ['r', 'b', 'k', 'g', 'm']
plt.scatter(m.meters, m.speed, s=30*m.weight, vmin=0, vmax=10, cmap=cm)

与えられた順序でポイントに色を付けます。または、カラーマップを使用するには:

cm = plt.cm.get_cmap('hot')  # or your colormap of choice
plt.scatter(m.meters, m.speed, s=30*m.weight, c=m.old, cmap=cm)

マーカーの形状を変更するには、独自のPatchesを追加するか、一度に1つのポイントを追加する必要があります。

markers = ['^', 'o', 'v', 's', 'd']
for px, py, c, s, t in Zip(m.meters, m.speed, m.old, m.weight, markers):
    plt.scatter(px, py, marker=t, c=cm(c/10.), vmin=0, vmax=10, s=400*s+100)
plt.show()

enter image description here

m.weightを別の範囲にスケーリングして、5番目のポイントを確認しました。5番目のポイントはサイズ0.0になります)。

5
xnx